Procházet zdrojové kódy

beef up TimeGridSlicer

Adam Shaw před 7 roky
rodič
revize
f3f4256072

+ 0 - 1
src/agenda/AgendaView.ts

@@ -101,7 +101,6 @@ export default class AgendaView extends AbstractAgendaView {
     return new TimeGridSlicer(
       dateProfile,
       this.dateProfileGenerator,
-      this.isRtl,
       this.dateEnv
     )
   })

+ 25 - 3
src/agenda/TimeGrid.ts

@@ -93,7 +93,10 @@ export default class TimeGrid extends StandardDateComponent {
   rangeToSegs(range: DateRange): Seg[] {
     let slicer = (this.props as any).slicer as TimeGridSlicer
 
-    return slicer.rangeToSegs(range)
+    return slicer.rangeToSegs(range).map((seg) => {
+      seg.component = this
+      return seg
+    })
   }
 
 
@@ -245,9 +248,15 @@ export default class TimeGrid extends StandardDateComponent {
   renderColumns() {
     let { theme } = this
     let slicer = (this.props as any).slicer as TimeGridSlicer
-    let { dates } = slicer.daySeries
     let dateProfile = this.props.dateProfile
 
+    let dates = []
+    for (let col = 0; col < slicer.colCnt; col++) {
+      dates.push(
+        slicer.getColDate(col)
+      )
+    }
+
     let bgRow = new DayBgRow(this.context)
     this.rootBgContainerEl.innerHTML =
       '<table class="' + theme.getClass('tableGrid') + '">' +
@@ -260,6 +269,10 @@ export default class TimeGrid extends StandardDateComponent {
 
     this.colEls = findElements(this.el, '.fc-day, .fc-disabled-day')
 
+    if (this.isRtl) {
+      this.colEls.reverse()
+    }
+
     this.colPositions = new PositionCache(
       this.el,
       this.colEls,
@@ -323,6 +336,15 @@ export default class TimeGrid extends StandardDateComponent {
     this.highlightContainerEls = findElements(skeletonEl, '.fc-highlight-container')
     this.businessContainerEls = findElements(skeletonEl, '.fc-business-container')
 
+    if (this.isRtl) {
+      this.colContainerEls.reverse()
+      this.mirrorContainerEls.reverse()
+      this.fgContainerEls.reverse()
+      this.bgContainerEls.reverse()
+      this.highlightContainerEls.reverse()
+      this.businessContainerEls.reverse()
+    }
+
     this.el.appendChild(skeletonEl)
   }
 
@@ -479,7 +501,7 @@ export default class TimeGrid extends StandardDateComponent {
 
     for (i = 0; i < segs.length; i++) {
       seg = segs[i]
-      dayDate = slicer.daySeries.dates[seg.dayIndex]
+      dayDate = slicer.getColDate(seg.col)
 
       seg.top = this.computeDateTop(seg.start, dayDate)
       seg.bottom = Math.max(

+ 21 - 48
src/agenda/TimeGridSlicer.ts

@@ -6,62 +6,28 @@ import { DateEnv } from '../datelib/env'
 
 export default class TimeGridSlicer {
 
+  dateEnv: DateEnv
   dateProfile: DateProfile
-  daySeries: DaySeries
-  dateRanges: DateRange[]
-  isRtl: boolean
+  daySeries: DaySeries // TODO: make private!
   colCnt: number
 
 
-  constructor(dateProfile: DateProfile, dateProfileGenerator: DateProfileGenerator, isRtl: boolean, dateEnv: DateEnv) {
+  constructor(dateProfile: DateProfile, dateProfileGenerator: DateProfileGenerator, dateEnv: DateEnv) {
+    this.dateEnv = dateEnv
     this.dateProfile = dateProfile
-    this.daySeries = new DaySeries(dateProfile.renderRange, dateProfileGenerator)
-    this.dateRanges = this.daySeries.dates.map(function(dayDate) {
-      return {
-        start: dateEnv.add(dayDate, dateProfile.minTime),
-        end: dateEnv.add(dayDate, dateProfile.maxTime)
-      }
-    })
-    this.isRtl = isRtl
+    this.daySeries = new DaySeries(dateProfile.renderRange, dateProfileGenerator) // should pass this in
     this.colCnt = this.daySeries.dates.length
   }
 
 
   // Slices up the given span (unzoned start/end with other misc data) into an array of segments
   rangeToSegs(range: DateRange): Seg[] {
-
-    range = intersectRanges(range, this.dateProfile.validRange)
-
-    if (range) {
-      let segs = this.sliceRangeByTimes(range)
-      let i
-
-      for (i = 0; i < segs.length; i++) {
-        if (this.isRtl) {
-          segs[i].col = this.daySeries.dates.length - 1 - segs[i].dayIndex
-        } else {
-          segs[i].col = segs[i].dayIndex
-        }
-
-        segs[i].component = this
-      }
-
-      return segs
-    } else {
-      return []
-    }
-  }
-
-
-  sliceRangeByTimes(range) {
-    let { dateRanges } = this
     let segs = []
-    let segRange
-    let dayIndex
-
-    for (dayIndex = 0; dayIndex < dateRanges.length; dayIndex++) {
 
-      segRange = intersectRanges(range, dateRanges[dayIndex])
+    // important to do ALL cols (tho can be optimized)
+    // because of extended minTime/maxTime
+    for (let col = 0; col < this.colCnt; col++) {
+      let segRange = intersectRanges(range, this.getColRange(col))
 
       if (segRange) {
         segs.push({
@@ -69,7 +35,7 @@ export default class TimeGridSlicer {
           end: segRange.end,
           isStart: segRange.start.valueOf() === range.start.valueOf(),
           isEnd: segRange.end.valueOf() === range.end.valueOf(),
-          dayIndex: dayIndex
+          col
         })
       }
     }
@@ -79,11 +45,18 @@ export default class TimeGridSlicer {
 
 
   getColDate(col: number) {
-    if (this.isRtl) {
-      col = this.colCnt - 1 - col
-    }
-
     return this.daySeries.dates[col]
   }
 
+
+  getColRange(col: number): DateRange { // TODO: cache these
+    let { dateEnv, dateProfile } = this
+    let date = this.getColDate(col)
+
+    return {
+      start: dateEnv.add(date, dateProfile.minTime),
+      end: dateEnv.add(date, dateProfile.maxTime)
+    }
+  }
+
 }

+ 1 - 1
src/basic/DayGridSlicer.ts

@@ -7,7 +7,7 @@ import DayTable from '../common/DayTable'
 
 export default class DayGridSlicer {
 
-  dayTable: DayTable
+  private dayTable: DayTable
   dateProfile: DateProfile
   isRtl: boolean
   rowCnt: number

+ 2 - 2
src/util/misc.ts

@@ -452,7 +452,7 @@ export function computeAlignedDayRange(timedRange: DateRange): DateRange {
 
 // given a timed range, computes an all-day range based on how for the end date bleeds into the next day
 // TODO: give nextDayThreshold a default arg
-export function computeVisibleDayRange(timedRange: DateRange, nextDayThreshold: Duration): DateRange {
+export function computeVisibleDayRange(timedRange: DateRange, nextDayThreshold: Duration = createDuration(0)): DateRange {
   let startDay: DateMarker = startOfDay(timedRange.start) // the beginning of the day the range starts
   let end: DateMarker = timedRange.end
   let endDay: DateMarker = startOfDay(end)
@@ -476,7 +476,7 @@ export function computeVisibleDayRange(timedRange: DateRange, nextDayThreshold:
 
 // spans from one day into another?
 export function isMultiDayRange(range: DateRange) {
-  let visibleRange = computeVisibleDayRange(range, createDuration(0))
+  let visibleRange = computeVisibleDayRange(range)
 
   return diffDays(visibleRange.start, visibleRange.end) > 1
 }