Adam Shaw пре 7 година
родитељ
комит
c7d0eb617a
5 измењених фајлова са 47 додато и 80 уклоњено
  1. 1 1
      src/agenda/AgendaView.ts
  2. 13 12
      src/agenda/TimeGrid.ts
  3. 2 2
      src/basic/BasicView.ts
  4. 13 12
      src/basic/DayGrid.ts
  5. 18 53
      src/component/DayTable.ts

+ 1 - 1
src/agenda/AgendaView.ts

@@ -189,7 +189,7 @@ export default class AgendaView extends View {
     if (this.header) {
       this.header.receiveProps({
         dateProfile: props.dateProfile,
-        dates: dayTable.dayDates,
+        dates: dayTable.daySeries.dates,
         datesRepDistinctDays: true,
         renderIntroHtml: this.renderHeadIntroHtml
       })

+ 13 - 12
src/agenda/TimeGrid.ts

@@ -14,6 +14,7 @@ import StandardDateComponent from '../component/StandardDateComponent'
 import OffsetTracker from '../common/OffsetTracker'
 import { Hit } from '../interactions/HitDragging'
 import DayBgRow from '../basic/DayBgRow'
+import DayTable from '../component/DayTable'
 
 /* A component that renders one or more columns of vertical time slots
 ----------------------------------------------------------------------------------------------------------------------*/
@@ -93,7 +94,7 @@ 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 dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
 
     range = intersectRanges(range, this.props.dateProfile.validRange)
 
@@ -123,7 +124,7 @@ export default class TimeGrid extends StandardDateComponent {
 
 
   sliceRangeByTimes(range) {
-    let dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
     let segs = []
     let segRange
     let dayIndex
@@ -294,11 +295,11 @@ export default class TimeGrid extends StandardDateComponent {
 
   renderColumns() {
     let { theme, dateEnv } = this
-    let dayTable = (this.props as any).dayTable
-    let { dayDates } = dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
+    let { dates } = dayTable.daySeries
     let dateProfile = this.props.dateProfile
 
-    this.dayRanges = dayDates.map(function(dayDate) {
+    this.dayRanges = dates.map(function(dayDate) {
       return {
         start: dateEnv.add(dayDate, dateProfile.minTime),
         end: dateEnv.add(dayDate, dateProfile.maxTime)
@@ -309,7 +310,7 @@ export default class TimeGrid extends StandardDateComponent {
     this.rootBgContainerEl.innerHTML =
       '<table class="' + theme.getClass('tableGrid') + '">' +
         bgRow.renderHtml({
-          dates: dayDates,
+          dates,
           dateProfile,
           renderIntroHtml: this.renderProps.renderBgIntroHtml
         }) +
@@ -339,7 +340,7 @@ export default class TimeGrid extends StandardDateComponent {
 
   // Renders the DOM that the view's content will live in
   renderContentSkeleton() {
-    let dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
     let parts = []
     let skeletonEl: HTMLElement
 
@@ -391,7 +392,7 @@ export default class TimeGrid extends StandardDateComponent {
 
   // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col
   groupSegsByCol(segs) {
-    let dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
     let segsByCol = []
     let i
 
@@ -410,7 +411,7 @@ export default class TimeGrid extends StandardDateComponent {
   // Given segments grouped by column, insert the segments' elements into a parallel array of container
   // elements, each living within a column.
   attachSegsByCol(segsByCol, containerEls: HTMLElement[]) {
-    let dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
     let col
     let segs
     let i
@@ -528,7 +529,7 @@ export default class TimeGrid extends StandardDateComponent {
 
   // For each segment in an array, computes and assigns its top and bottom properties
   computeSegVerticals(segs) {
-    let dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
     let eventMinHeight = this.opt('agendaEventMinHeight')
     let i
     let seg
@@ -536,7 +537,7 @@ export default class TimeGrid extends StandardDateComponent {
 
     for (i = 0; i < segs.length; i++) {
       seg = segs[i]
-      dayDate = dayTable.dayDates[seg.dayIndex]
+      dayDate = dayTable.daySeries.dates[seg.dayIndex]
 
       seg.top = this.computeDateTop(seg.start, dayDate)
       seg.bottom = Math.max(
@@ -595,7 +596,7 @@ export default class TimeGrid extends StandardDateComponent {
 
   queryHit(leftOffset, topOffset): Hit {
     let { dateEnv, snapsPerSlot, slatPositions, colPositions, offsetTracker } = this
-    let dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
 
     if (offsetTracker.isWithinClipping(leftOffset, topOffset)) {
       let leftOrigin = offsetTracker.computeLeft()

+ 2 - 2
src/basic/BasicView.ts

@@ -140,8 +140,8 @@ export default class BasicView extends View {
   })
 
 
-  sliceDayDates = reselector(function(dayTable: DayTable) {
-    return dayTable.dayDates.slice(0, dayTable.colCnt)
+  sliceDayDates = reselector(function(dayTable: DayTable) { // TODO: put into dayTable
+    return dayTable.daySeries.dates.slice(0, dayTable.colCnt)
   })
 
 

+ 13 - 12
src/basic/DayGrid.ts

@@ -24,6 +24,7 @@ import OffsetTracker from '../common/OffsetTracker'
 import { EventRenderRange } from '../component/event-rendering'
 import { buildGotoAnchorHtml, getDayClasses } from '../component/date-rendering'
 import DayBgRow from './DayBgRow'
+import DayTable from '../component/DayTable'
 
 const DAY_NUM_FORMAT = createFormatter({ day: 'numeric' })
 const WEEK_NUM_FORMAT = createFormatter({ week: 'numeric' })
@@ -80,7 +81,7 @@ 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 dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
 
     range = intersectRanges(range, this.props.dateProfile.validRange)
 
@@ -133,7 +134,7 @@ export default class DayGrid extends StandardDateComponent {
 
   renderDates(dateProfile) {
     let { view, dateEnv } = this
-    let dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
     let rowCnt = dayTable.rowCnt
     let colCnt = dayTable.colCnt
     let html = ''
@@ -186,7 +187,7 @@ export default class DayGrid extends StandardDateComponent {
   // `row` is the row number.
   renderDayRowHtml(row, isRigid) {
     let { theme } = this
-    let dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
     let { daysPerRow } = dayTable
     let classes = [ 'fc-row', 'fc-week', theme.getClass('dayRow') ]
 
@@ -194,7 +195,7 @@ export default class DayGrid extends StandardDateComponent {
       classes.push('fc-rigid')
     }
 
-    let dates = dayTable.dayDates.slice(
+    let dates = dayTable.daySeries.dates.slice(
       row * daysPerRow,
       (row + 1) * daysPerRow
     )
@@ -234,7 +235,7 @@ export default class DayGrid extends StandardDateComponent {
 
 
   getIsDayNumbersVisible() {
-    let dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
 
     return dayTable.rowCnt > 1
   }
@@ -257,7 +258,7 @@ export default class DayGrid extends StandardDateComponent {
 
 
   renderNumberCellsHtml(row) {
-    let dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
     let htmls = []
     let col
     let date
@@ -329,7 +330,7 @@ export default class DayGrid extends StandardDateComponent {
 
 
   buildPositionCaches() {
-    let dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
 
     this.colPositions.build()
     this.rowPositions.build()
@@ -353,7 +354,7 @@ export default class DayGrid extends StandardDateComponent {
 
   queryHit(leftOffset, topOffset): Hit {
     let { colPositions, rowPositions, offsetTracker } = this
-    let dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
 
     if (offsetTracker.isWithinClipping(leftOffset, topOffset)) {
       let leftOrigin = offsetTracker.computeLeft()
@@ -388,7 +389,7 @@ export default class DayGrid extends StandardDateComponent {
 
 
   getCellEl(row, col) {
-    let dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
 
     return this.cellEls[row * dayTable.colCnt + col]
   }
@@ -491,7 +492,7 @@ export default class DayGrid extends StandardDateComponent {
   // `row` is the row number.
   // `levelLimit` is a number for the maximum (inclusive) number of levels allowed.
   limitRow(row, levelLimit) {
-    let dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
     let rowStruct = this.eventRenderer.rowStructs[row]
     let moreNodes = [] // array of "more" <a> links and <td> DOM nodes
     let col = 0 // col #, left-to-right (not chronologically)
@@ -607,7 +608,7 @@ export default class DayGrid extends StandardDateComponent {
   // Responsible for attaching click handler as well.
   renderMoreLink(row, col, hiddenSegs) {
     let { view, dateEnv } = this
-    let dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
 
     let a = createElement('a', { className: 'fc-more' })
     a.innerText = this.getMoreLinkText(hiddenSegs.length)
@@ -652,7 +653,7 @@ export default class DayGrid extends StandardDateComponent {
   // Reveals the popover that displays all events within a cell
   showSegPopover(row, col, moreLink: HTMLElement, segs) {
     let { calendar, view, theme } = this
-    let dayTable = (this.props as any).dayTable
+    let dayTable = (this.props as any).dayTable as DayTable
     let moreWrap = moreLink.parentNode as HTMLElement // the <div> wrapper around the <a>
     let topEl: HTMLElement // the element we want to match the top coordinate of
     let options

+ 18 - 53
src/component/DayTable.ts

@@ -1,6 +1,7 @@
-import { DateMarker, addDays, diffDays } from '../datelib/marker'
+import { DateMarker, addDays } from '../datelib/marker'
 import { DateRange } from '../datelib/date-range'
 import DateProfileGenerator, { DateProfile } from 'src/DateProfileGenerator'
+import DaySeries from './DaySeries'
 
 /*
 computes date/index/cell information.
@@ -8,10 +9,9 @@ doesn't do any rendering.
 */
 export default class DayTable {
 
-  dayDates: DateMarker[] // whole-day dates for each column. left to right
-  dayIndices: any // for each day from start, the offset
-  isRtl: boolean
+  daySeries: DaySeries
   daysPerRow: any
+  isRtl: boolean
   rowCnt: any
   colCnt: any
 
@@ -19,45 +19,29 @@ export default class DayTable {
   // Populates internal variables used for date calculation and rendering
   // breakOnWeeks - should create a new row for each week? not specified, so default is FALSY
   constructor(dateProfile: DateProfile, dateProfileGenerator: DateProfileGenerator, isRtl: boolean, breakOnWeeks: boolean) {
-    let date: DateMarker = dateProfile.renderRange.start
-    let end: DateMarker = dateProfile.renderRange.end
-    let dayIndex = -1
-    let dayIndices = []
-    let dayDates: DateMarker[] = []
+    let daySeries = new DaySeries(dateProfile, dateProfileGenerator)
+    let { dates } = daySeries
     let daysPerRow
     let firstDay
     let rowCnt
 
-    this.isRtl = isRtl
-
-    while (date < end) { // loop each day from start to end
-      if (dateProfileGenerator.isHiddenDay(date)) {
-        dayIndices.push(dayIndex + 0.5) // mark that it's between indices
-      } else {
-        dayIndex++
-        dayIndices.push(dayIndex)
-        dayDates.push(date)
-      }
-      date = addDays(date, 1)
-    }
-
     if (breakOnWeeks) {
       // count columns until the day-of-week repeats
-      firstDay = dayDates[0].getUTCDay()
-      for (daysPerRow = 1; daysPerRow < dayDates.length; daysPerRow++) {
-        if (dayDates[daysPerRow].getUTCDay() === firstDay) {
+      firstDay = dates[0].getUTCDay()
+      for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow++) {
+        if (dates[daysPerRow].getUTCDay() === firstDay) {
           break
         }
       }
-      rowCnt = Math.ceil(dayDates.length / daysPerRow)
+      rowCnt = Math.ceil(dates.length / daysPerRow)
     } else {
       rowCnt = 1
-      daysPerRow = dayDates.length
+      daysPerRow = dates.length
     }
 
-    this.dayDates = dayDates
-    this.dayIndices = dayIndices
+    this.daySeries = daySeries
     this.daysPerRow = daysPerRow
+    this.isRtl = isRtl
     this.rowCnt = rowCnt
     this.colCnt = this.computeColCnt()
   }
@@ -71,7 +55,7 @@ export default class DayTable {
 
   // Computes the DateMarker for the given cell
   getCellDate(row, col): DateMarker {
-    return this.dayDates[this.getCellDayIndex(row, col)]
+    return this.daySeries.dates[this.getCellDayIndex(row, col)]
   }
 
 
@@ -85,13 +69,13 @@ export default class DayTable {
 
 
   // Returns the number of day cells, chronologically, from the first of the grid (0-based)
-  getCellDayIndex(row, col) {
+  private getCellDayIndex(row, col) {
     return row * this.daysPerRow + this.getColDayIndex(col)
   }
 
 
   // Returns the numner of day cells, chronologically, from the first cell in *any given row*
-  getColDayIndex(col) {
+  private getColDayIndex(col) {
     if (this.isRtl) {
       return this.colCnt - 1 - col
     } else {
@@ -100,25 +84,6 @@ export default class DayTable {
   }
 
 
-  // Given a date, returns its chronolocial cell-index from the first cell of the grid.
-  // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.
-  // If before the first offset, returns a negative number.
-  // If after the last offset, returns an offset past the last cell offset.
-  // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.
-  getDateDayIndex(date) {
-    let dayIndices = this.dayIndices
-    let dayOffset = Math.floor(diffDays(this.dayDates[0], date))
-
-    if (dayOffset < 0) {
-      return dayIndices[0] - 1
-    } else if (dayOffset >= dayIndices.length) {
-      return dayIndices[dayIndices.length - 1] + 1
-    } else {
-      return dayIndices[dayOffset]
-    }
-  }
-
-
   /* Slicing
   ------------------------------------------------------------------------------------------------------------------*/
 
@@ -127,8 +92,8 @@ export default class DayTable {
   // range already normalized to start-of-day
   sliceRangeByRow(range) {
     let daysPerRow = this.daysPerRow
-    let rangeFirst = this.getDateDayIndex(range.start) // inclusive first index
-    let rangeLast = this.getDateDayIndex(addDays(range.end, -1)) // inclusive last index
+    let rangeFirst = this.daySeries.getDateDayIndex(range.start) // inclusive first index
+    let rangeLast = this.daySeries.getDateDayIndex(addDays(range.end, -1)) // inclusive last index
     let segs = []
     let row
     let rowFirst