Adam Shaw 7 лет назад
Родитель
Сommit
c67969243a

+ 21 - 10
src/agenda/AgendaView.ts

@@ -20,11 +20,12 @@ import { EventUiHash, hasBgRendering } from '../component/event-rendering'
 import { buildGotoAnchorHtml, getAllDayHtml } from '../component/date-rendering'
 import { StandardDateComponentProps } from '../component/StandardDateComponent'
 import { DateMarker } from '../datelib/marker'
-import DayTable from '../component/DayTable';
 import { ComponentContext } from '../component/Component';
 import { ViewSpec } from '../structs/view-spec';
 import DateProfileGenerator, { DateProfile } from '../DateProfileGenerator';
 import DayTableHeader from '../basic/DayTableHeader'
+import DayGridSlicer from '../basic/DayGridSlicer'
+import TimeGridSlicer from './TimeGridSlicer'
 
 const AGENDA_ALL_DAY_EVENT_LIMIT = 5
 const WEEK_HEADER_FORMAT = createFormatter({ week: 'short' })
@@ -44,7 +45,8 @@ export default class AgendaView extends View {
   scroller: ScrollComponent
   axisWidth: any // the width of the time axis running down the side
 
-  dayTable: DayTable
+  dayGridSlicer: DayGridSlicer
+  timeGridSlicer: TimeGridSlicer
 
   // reselectors
   filterEventsForTimeGrid: any
@@ -184,13 +186,12 @@ export default class AgendaView extends View {
       }
     }
 
-    let dayTable = this.dayTable =
-      this.buildDayTable(props.dateProfile)
+    let timeGridSlicer = this.buildTimeGridSlicer(props.dateProfile)
 
     if (this.header) {
       this.header.receiveProps({
         dateProfile: props.dateProfile,
-        dates: dayTable.daySeries.dates,
+        dates: timeGridSlicer.daySeries.dates,
         datesRepDistinctDays: true,
         renderIntroHtml: this.renderHeadIntroHtml
       })
@@ -202,7 +203,7 @@ export default class AgendaView extends View {
         dateSelection: timedSelection,
         eventDrag: this.buildEventDragForTimeGrid(props.eventDrag),
         eventResize: this.buildEventResizeForTimeGrid(props.eventResize),
-        dayTable
+        slicer: timeGridSlicer
       })
     )
 
@@ -213,15 +214,15 @@ export default class AgendaView extends View {
           dateSelection: allDaySeletion,
           eventDrag: this.buildEventDragForDayGrid(props.eventDrag),
           eventResize: this.buildEventResizeForDayGrid(props.eventResize),
-          dayTable
+          slicer: this.buildDayGridSlicer(props.dateProfile)
         })
       )
     }
   }
 
 
-  buildDayTable = reselector(function(this: AgendaView, dateProfile: DateProfile) {
-    return new DayTable(
+  buildDayGridSlicer = reselector(function(this: AgendaView, dateProfile: DateProfile) {
+    return new DayGridSlicer(
       dateProfile,
       this.dateProfileGenerator,
       this.isRtl,
@@ -230,6 +231,16 @@ export default class AgendaView extends View {
   })
 
 
+  buildTimeGridSlicer = reselector(function(this: AgendaView, dateProfile) {
+    return new TimeGridSlicer(
+      dateProfile,
+      this.dateProfileGenerator,
+      this.isRtl,
+      this.dateEnv
+    )
+  })
+
+
   /* Now Indicator
   ------------------------------------------------------------------------------------------------------------------*/
 
@@ -393,7 +404,7 @@ export default class AgendaView extends View {
         '<th class="fc-axis fc-week-number ' + theme.getClass('widgetHeader') + '" ' + this.axisStyleAttr() + '>' +
           buildGotoAnchorHtml( // aside from link, important for matchCellWidths
             this,
-            { date: weekStart, type: 'week', forceOff: this.dayTable.colCnt > 1 },
+            { date: weekStart, type: 'week', forceOff: this.header.props.dates.length > 1 },
             htmlEscape(weekText) // inner HTML
           ) +
         '</th>'

+ 17 - 66
src/agenda/TimeGrid.ts

@@ -1,7 +1,7 @@
 import { htmlEscape } from '../util/html'
 import { htmlToElement, findElements, createElement, removeElement, applyStyle } from '../util/dom-manip'
 import PositionCache from '../common/PositionCache'
-import { DateRange, intersectRanges } from '../datelib/date-range'
+import { DateRange } from '../datelib/date-range'
 import TimeGridEventRenderer from './TimeGridEventRenderer'
 import TimeGridMirrorRenderer from './TimeGridMirrorRenderer'
 import TimeGridFillRenderer from './TimeGridFillRenderer'
@@ -14,11 +14,10 @@ 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'
+import TimeGridSlicer from './TimeGridSlicer'
 
 /* A component that renders one or more columns of vertical time slots
 ----------------------------------------------------------------------------------------------------------------------*/
-// We mixin DayTable, even though there is only a single row of days
 
 // potential nice values for the slot-duration and interval-duration
 // from largest to smallest
@@ -93,57 +92,9 @@ 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 as DayTable
+    let slicer = (this.props as any).slicer as TimeGridSlicer
 
-    range = intersectRanges(range, this.props.dateProfile.validRange)
-
-    if (range) {
-      let segs = this.sliceRangeByTimes(range)
-      let i
-
-      for (i = 0; i < segs.length; i++) {
-        if (this.isRtl) {
-          segs[i].col = dayTable.daysPerRow - 1 - segs[i].dayIndex
-        } else {
-          segs[i].col = segs[i].dayIndex
-        }
-
-        segs[i].component = this
-      }
-
-      return segs
-    } else {
-      return []
-    }
-  }
-
-
-  /* Date Handling
-  ------------------------------------------------------------------------------------------------------------------*/
-
-
-  sliceRangeByTimes(range) {
-    let dayTable = (this.props as any).dayTable as DayTable
-    let segs = []
-    let segRange
-    let dayIndex
-
-    for (dayIndex = 0; dayIndex < dayTable.daysPerRow; dayIndex++) {
-
-      segRange = intersectRanges(range, this.dayRanges[dayIndex])
-
-      if (segRange) {
-        segs.push({
-          start: segRange.start,
-          end: segRange.end,
-          isStart: segRange.start.valueOf() === range.start.valueOf(),
-          isEnd: segRange.end.valueOf() === range.end.valueOf(),
-          dayIndex: dayIndex
-        })
-      }
-    }
-
-    return segs
+    return slicer.rangeToSegs(range)
   }
 
 
@@ -294,8 +245,8 @@ export default class TimeGrid extends StandardDateComponent {
 
   renderColumns() {
     let { theme, dateEnv } = this
-    let dayTable = (this.props as any).dayTable as DayTable
-    let { dates } = dayTable.daySeries
+    let slicer = (this.props as any).slicer as TimeGridSlicer
+    let { dates } = slicer.daySeries
     let dateProfile = this.props.dateProfile
 
     this.dayRanges = dates.map(function(dayDate) {
@@ -309,7 +260,7 @@ export default class TimeGrid extends StandardDateComponent {
     this.rootBgContainerEl.innerHTML =
       '<table class="' + theme.getClass('tableGrid') + '">' +
         bgRow.renderHtml({
-          dates,
+          dates, // TODO: pass over cell objects
           dateProfile,
           renderIntroHtml: this.renderProps.renderBgIntroHtml
         }) +
@@ -339,7 +290,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 as DayTable
+    let slicer = (this.props as any).slicer as TimeGridSlicer
     let parts = []
     let skeletonEl: HTMLElement
 
@@ -347,7 +298,7 @@ export default class TimeGrid extends StandardDateComponent {
       this.renderProps.renderIntroHtml()
     )
 
-    for (let i = 0; i < dayTable.colCnt; i++) {
+    for (let i = 0; i < slicer.colCnt; i++) {
       parts.push(
         '<td>' +
           '<div class="fc-content-col">' +
@@ -391,11 +342,11 @@ 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 as DayTable
+    let slicer = (this.props as any).slicer as TimeGridSlicer
     let segsByCol = []
     let i
 
-    for (i = 0; i < dayTable.colCnt; i++) {
+    for (i = 0; i < slicer.colCnt; i++) {
       segsByCol.push([])
     }
 
@@ -410,12 +361,12 @@ 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 as DayTable
+    let slicer = (this.props as any).slicer as TimeGridSlicer
     let col
     let segs
     let i
 
-    for (col = 0; col < dayTable.colCnt; col++) { // iterate each column grouping
+    for (col = 0; col < slicer.colCnt; col++) { // iterate each column grouping
       segs = segsByCol[col]
 
       for (i = 0; i < segs.length; i++) {
@@ -528,7 +479,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 as DayTable
+    let slicer = (this.props as any).slicer as TimeGridSlicer
     let eventMinHeight = this.opt('agendaEventMinHeight')
     let i
     let seg
@@ -536,7 +487,7 @@ export default class TimeGrid extends StandardDateComponent {
 
     for (i = 0; i < segs.length; i++) {
       seg = segs[i]
-      dayDate = dayTable.daySeries.dates[seg.dayIndex]
+      dayDate = slicer.daySeries.dates[seg.dayIndex]
 
       seg.top = this.computeDateTop(seg.start, dayDate)
       seg.bottom = Math.max(
@@ -595,7 +546,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 as DayTable
+    let slicer = (this.props as any).slicer as TimeGridSlicer
 
     if (offsetTracker.isWithinClipping(leftOffset, topOffset)) {
       let leftOrigin = offsetTracker.computeLeft()
@@ -610,7 +561,7 @@ export default class TimeGrid extends StandardDateComponent {
         let localSnapIndex = Math.floor(partial * snapsPerSlot) // the snap # relative to start of slat
         let snapIndex = slatIndex * snapsPerSlot + localSnapIndex
 
-        let dayDate = dayTable.getCellDate(0, colIndex) // row=0
+        let dayDate = slicer.getColDate(colIndex)
         let time = addDurations(
           this.props.dateProfile.minTime,
           multiplyDuration(this.snapDuration, snapIndex)

+ 5 - 2
src/agenda/TimeGridEventRenderer.ts

@@ -5,6 +5,7 @@ import FgEventRenderer, { buildSegCompareObj } from '../component/renderers/FgEv
 import { Seg } from '../component/DateComponent'
 import { isMultiDayRange, compareByFieldSpecs } from '../util/misc'
 import TimeGrid from './TimeGrid'
+import TimeGridSlicer from './TimeGridSlicer';
 
 /*
 Only handles foreground segs.
@@ -49,7 +50,8 @@ export default class TimeGridEventRenderer extends FgEventRenderer {
 
   computeSizes() {
     let { timeGrid, segsByCol } = this
-    let colCnt = (timeGrid.props as any).dayTable.colCnt
+    let slicer = (timeGrid.props as any).slicer as TimeGridSlicer
+    let colCnt = slicer.colCnt
 
     if (segsByCol) {
       for (let col = 0; col < colCnt; col++) {
@@ -64,7 +66,8 @@ export default class TimeGridEventRenderer extends FgEventRenderer {
 
   assignSizes() {
     let { timeGrid, segsByCol } = this
-    let colCnt = (timeGrid.props as any).dayTable.colCnt
+    let slicer = (timeGrid.props as any).slicer as TimeGridSlicer
+    let colCnt = slicer.colCnt
 
     if (segsByCol) {
       for (let col = 0; col < colCnt; col++) {

+ 13 - 15
src/basic/BasicView.ts

@@ -16,12 +16,12 @@ import DayGrid from './DayGrid'
 import { buildGotoAnchorHtml } from '../component/date-rendering'
 import { StandardDateComponentProps } from '../component/StandardDateComponent'
 import { assignTo } from '../util/object'
-import DayTable from '../component/DayTable';
 import { ComponentContext } from '../component/Component'
 import { ViewSpec } from '../structs/view-spec'
 import DateProfileGenerator, { DateProfile } from '../DateProfileGenerator'
 import reselector from '../util/reselector'
 import DayTableHeader from './DayTableHeader'
+import DayGridSlicer from './DayGridSlicer'
 
 const WEEK_NUM_FORMAT = createFormatter({ week: 'numeric' })
 
@@ -36,8 +36,6 @@ export default class BasicView extends View {
   scroller: ScrollComponent
   header: DayTableHeader
   dayGrid: DayGrid // the main subcomponent that does most of the heavy lifting
-
-  dayTable: DayTable
   colWeekNumbersVisible: boolean
 
 
@@ -110,28 +108,27 @@ export default class BasicView extends View {
   render(props: StandardDateComponentProps) {
     super.render(props)
 
-    let dayTable = this.dayTable =
-      this.buildDayTable(props.dateProfile)
+    let slicer = this.buildSlicer(props.dateProfile)
 
     if (this.header) {
       this.header.receiveProps({
         dateProfile: props.dateProfile,
-        dates: this.sliceDayDates(dayTable), // get just the first row
-        datesRepDistinctDays: dayTable.rowCnt === 1,
+        dates: this.sliceDayDates(slicer), // get just the first row
+        datesRepDistinctDays: slicer.rowCnt === 1,
         renderIntroHtml: this.renderHeadIntroHtml
       })
     }
 
     this.dayGrid.receiveProps(
       assignTo({}, props, {
-        dayTable
+        slicer
       })
     )
   }
 
 
-  buildDayTable = reselector(function(this: BasicView, dateProfile: DateProfile) {
-    return new DayTable(
+  buildSlicer = reselector(function(this: BasicView, dateProfile: DateProfile) {
+    return new DayGridSlicer(
       dateProfile,
       this.dateProfileGenerator,
       this.isRtl,
@@ -140,8 +137,8 @@ export default class BasicView extends View {
   })
 
 
-  sliceDayDates = reselector(function(dayTable: DayTable) { // TODO: put into dayTable
-    return dayTable.daySeries.dates.slice(0, dayTable.colCnt)
+  sliceDayDates = reselector(function(slicer: DayGridSlicer) { // TODO: put into slicer
+    return slicer.daySeries.dates.slice(0, slicer.colCnt)
   })
 
 
@@ -321,15 +318,16 @@ export default class BasicView extends View {
 
   // Generates the HTML that will go before content-skeleton cells that display the day/week numbers
   renderDayGridNumberIntroHtml = (row) => {
-    let { dateEnv, dayTable } = this
-    let weekStart = dayTable.getCellDate(row, 0)
+    let { dateEnv } = this
+    let slicer = (this.dayGrid.props as any).slicer as DayGridSlicer
+    let weekStart = slicer.getCellDate(row, 0)
 
     if (this.colWeekNumbersVisible) {
       return '' +
         '<td class="fc-week-number">' +
           buildGotoAnchorHtml( // aside from link, important for matchCellWidths
             this,
-            { date: weekStart, type: 'week', forceOff: dayTable.colCnt === 1 },
+            { date: weekStart, type: 'week', forceOff: slicer.daySeries.dates.length === 1 },
             dateEnv.format(weekStart, WEEK_NUM_FORMAT) // inner HTML
           ) +
         '</td>'

+ 29 - 50
src/basic/DayGrid.ts

@@ -24,7 +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'
+import DayGridSlicer from './DayGridSlicer'
 
 const DAY_NUM_FORMAT = createFormatter({ day: 'numeric' })
 const WEEK_NUM_FORMAT = createFormatter({ week: 'numeric' })
@@ -49,6 +49,7 @@ export default class DayGrid extends StandardDateComponent {
 
   eventRenderer: DayGridEventRenderer
   renderProps: RenderProps
+  slicer: DayGridSlicer
 
   bottomCoordPadding: number = 0 // hack for extending the hit area for the last row of the coordinate grid
 
@@ -81,30 +82,9 @@ 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 as DayTable
+    let slicer = (this.props as any).slicer as DayGridSlicer
 
-    range = intersectRanges(range, this.props.dateProfile.validRange)
-
-    if (range) {
-      let segs = dayTable.sliceRangeByRow(range)
-
-      for (let i = 0; i < segs.length; i++) {
-        let seg = segs[i]
-        seg.component = this
-
-        if (this.isRtl) {
-          seg.leftCol = dayTable.daysPerRow - 1 - seg.lastRowDayIndex
-          seg.rightCol = dayTable.daysPerRow - 1 - seg.firstRowDayIndex
-        } else {
-          seg.leftCol = seg.firstRowDayIndex
-          seg.rightCol = seg.lastRowDayIndex
-        }
-      }
-
-      return segs
-    } else {
-      return []
-    }
+    return slicer.rangeToSegs(range)
   }
 
 
@@ -134,9 +114,8 @@ export default class DayGrid extends StandardDateComponent {
 
   renderDates(dateProfile) {
     let { view, dateEnv } = this
-    let dayTable = (this.props as any).dayTable as DayTable
-    let rowCnt = dayTable.rowCnt
-    let colCnt = dayTable.colCnt
+    let slicer = (this.props as any).slicer as DayGridSlicer
+    let { rowCnt, colCnt } = slicer
     let html = ''
     let row
     let col
@@ -158,7 +137,7 @@ export default class DayGrid extends StandardDateComponent {
 
     this.colPositions = new PositionCache(
       this.el,
-      this.cellEls.slice(0, dayTable.colCnt), // only the first row
+      this.cellEls.slice(0, slicer.colCnt), // only the first row
       true,
       false // horizontal
     )
@@ -168,7 +147,7 @@ export default class DayGrid extends StandardDateComponent {
       for (col = 0; col < colCnt; col++) {
         this.publiclyTrigger('dayRender', [
           {
-            date: dateEnv.toDate(dayTable.getCellDate(row, col)),
+            date: dateEnv.toDate(slicer.getCellDate(row, col)),
             el: this.getCellEl(row, col),
             view
           }
@@ -187,15 +166,15 @@ export default class DayGrid extends StandardDateComponent {
   // `row` is the row number.
   renderDayRowHtml(row, isRigid) {
     let { theme } = this
-    let dayTable = (this.props as any).dayTable as DayTable
-    let { daysPerRow } = dayTable
+    let slicer = (this.props as any).slicer as DayGridSlicer
+    let { daysPerRow } = slicer
     let classes = [ 'fc-row', 'fc-week', theme.getClass('dayRow') ]
 
     if (isRigid) {
       classes.push('fc-rigid')
     }
 
-    let dates = dayTable.daySeries.dates.slice(
+    let dates = slicer.daySeries.dates.slice(
       row * daysPerRow,
       (row + 1) * daysPerRow
     )
@@ -235,9 +214,9 @@ export default class DayGrid extends StandardDateComponent {
 
 
   getIsDayNumbersVisible() {
-    let dayTable = (this.props as any).dayTable as DayTable
+    let slicer = (this.props as any).slicer as DayGridSlicer
 
-    return dayTable.rowCnt > 1
+    return slicer.rowCnt > 1
   }
 
 
@@ -258,13 +237,13 @@ export default class DayGrid extends StandardDateComponent {
 
 
   renderNumberCellsHtml(row) {
-    let dayTable = (this.props as any).dayTable as DayTable
+    let slicer = (this.props as any).slicer as DayGridSlicer
     let htmls = []
     let col
     let date
 
-    for (col = 0; col < dayTable.colCnt; col++) {
-      date = dayTable.getCellDate(row, col)
+    for (col = 0; col < slicer.colCnt; col++) {
+      date = slicer.getCellDate(row, col)
       htmls.push(this.renderNumberCellHtml(date))
     }
 
@@ -330,11 +309,11 @@ export default class DayGrid extends StandardDateComponent {
 
 
   buildPositionCaches() {
-    let dayTable = (this.props as any).dayTable as DayTable
+    let slicer = (this.props as any).slicer as DayGridSlicer
 
     this.colPositions.build()
     this.rowPositions.build()
-    this.rowPositions.bottoms[dayTable.rowCnt - 1] += this.bottomCoordPadding // hack
+    this.rowPositions.bottoms[slicer.rowCnt - 1] += this.bottomCoordPadding // hack
   }
 
 
@@ -354,7 +333,7 @@ export default class DayGrid extends StandardDateComponent {
 
   queryHit(leftOffset, topOffset): Hit {
     let { colPositions, rowPositions, offsetTracker } = this
-    let dayTable = (this.props as any).dayTable as DayTable
+    let slicer = (this.props as any).slicer as DayGridSlicer
 
     if (offsetTracker.isWithinClipping(leftOffset, topOffset)) {
       let leftOrigin = offsetTracker.computeLeft()
@@ -366,7 +345,7 @@ export default class DayGrid extends StandardDateComponent {
         return {
           component: this,
           dateSpan: {
-            range: dayTable.getCellRange(row, col),
+            range: slicer.getCellRange(row, col),
             allDay: true
           },
           dayEl: this.getCellEl(row, col),
@@ -389,9 +368,9 @@ export default class DayGrid extends StandardDateComponent {
 
 
   getCellEl(row, col) {
-    let dayTable = (this.props as any).dayTable as DayTable
+    let slicer = (this.props as any).slicer as DayGridSlicer
 
-    return this.cellEls[row * dayTable.colCnt + col]
+    return this.cellEls[row * slicer.colCnt + col]
   }
 
 
@@ -492,7 +471,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 as DayTable
+    let slicer = (this.props as any).slicer as DayGridSlicer
     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)
@@ -578,7 +557,7 @@ export default class DayGrid extends StandardDateComponent {
         }
       }
 
-      emptyCellsUntil(dayTable.colCnt) // finish off the level
+      emptyCellsUntil(slicer.colCnt) // finish off the level
       rowStruct.moreEls = moreNodes // for easy undoing later
       rowStruct.limitedEls = limitedNodes // for easy undoing later
     }
@@ -608,13 +587,13 @@ 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 as DayTable
+    let slicer = (this.props as any).slicer as DayGridSlicer
 
     let a = createElement('a', { className: 'fc-more' })
     a.innerText = this.getMoreLinkText(hiddenSegs.length)
     a.addEventListener('click', (ev) => {
       let clickOption = this.opt('eventLimitClick')
-      let date = dayTable.getCellDate(row, col)
+      let date = slicer.getCellDate(row, col)
       let moreEl = ev.currentTarget as HTMLElement
       let dayEl = this.getCellEl(row, col)
       let allSegs = this.getCellSegs(row, col)
@@ -653,12 +632,12 @@ 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 as DayTable
+    let slicer = (this.props as any).slicer as DayGridSlicer
     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
 
-    if (dayTable.rowCnt === 1) {
+    if (slicer.rowCnt === 1) {
       topEl = view.el // will cause the popover to cover any sort of header
     } else {
       topEl = this.rowEls[row] // will align with top of row
@@ -675,7 +654,7 @@ export default class DayGrid extends StandardDateComponent {
           el
         )
         this.updateSegPopoverTile(
-          dayTable.getCellDate(row, col),
+          slicer.getCellDate(row, col),
           segs
         )
       },

+ 7 - 5
src/basic/DayGridEventRenderer.ts

@@ -2,6 +2,7 @@ import { createElement, removeElement, appendToElement, prependToElement } from
 import DayGrid from './DayGrid'
 import { Seg } from '../component/DateComponent'
 import SimpleDayGridEventRenderer from './SimpleDayGridEventRenderer'
+import DayGridSlicer from './DayGridSlicer'
 
 
 /* Event-rendering methods for the DayGrid class
@@ -72,7 +73,8 @@ export default class DayGridEventRenderer extends SimpleDayGridEventRenderer {
   // NOTE: modifies rowSegs
   renderSegRow(row, rowSegs) {
     let { dayGrid } = this
-    let colCnt = (dayGrid.props as any).dayTable.colCnt
+    let slicer = (dayGrid.props as any).slicer as DayGridSlicer
+    let colCnt = slicer.colCnt
     let segLevels = this.buildSegLevels(rowSegs) // group into sub-arrays of levels
     let levelCnt = Math.max(1, segLevels.length) // ensure at least one level
     let tbody = document.createElement('tbody')
@@ -203,11 +205,11 @@ export default class DayGridEventRenderer extends SimpleDayGridEventRenderer {
 
   // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row
   groupSegRows(segs: Seg[]) {
-    let dayTable = (this.dayGrid.props as any).dayTable
+    let slicer = (this.dayGrid.props as any).slicer as DayGridSlicer
     let segRows = []
     let i
 
-    for (i = 0; i < dayTable.rowCnt; i++) {
+    for (i = 0; i < slicer.rowCnt; i++) {
       segRows.push([])
     }
 
@@ -221,9 +223,9 @@ export default class DayGridEventRenderer extends SimpleDayGridEventRenderer {
 
   // Computes a default `displayEventEnd` value if one is not expliclty defined
   computeDisplayEventEnd() {
-    let dayTable = (this.dayGrid.props as any).dayTable
+    let slicer = (this.dayGrid.props as any).slicer as DayGridSlicer
 
-    return dayTable.colCnt === 1 // we'll likely have space if there's only one day
+    return slicer.colCnt === 1 // we'll likely have space if there's only one day
   }
 
 }

+ 3 - 1
src/basic/DayGridFillRenderer.ts

@@ -2,6 +2,7 @@ import { htmlToElement, createElement, appendToElement, prependToElement } from
 import FillRenderer from '../component/renderers/FillRenderer'
 import DayGrid from './DayGrid'
 import { Seg } from '../component/DateComponent'
+import DayGridSlicer from './DayGridSlicer';
 
 
 export default class DayGridFillRenderer extends FillRenderer {
@@ -34,7 +35,8 @@ export default class DayGridFillRenderer extends FillRenderer {
   // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered.
   renderFillRow(type, seg: Seg): HTMLElement {
     let { dayGrid } = this
-    let colCnt = (dayGrid.props as any).dayTable.colCnt
+    let slicer = (dayGrid.props as any).slicer as DayGridSlicer
+    let colCnt = slicer.colCnt
     let startCol = seg.leftCol
     let endCol = seg.rightCol + 1
     let className

+ 3 - 1
src/basic/MonthView.ts

@@ -2,6 +2,7 @@ import { distributeHeight } from '../util/misc'
 import BasicView from './BasicView'
 import MonthViewDateProfileGenerator from './MonthViewDateProfileGenerator'
 import { DateMarker } from '../datelib/marker'
+import DayGridSlicer from './DayGridSlicer'
 
 
 /* A month view with day cells running in rows (one-per-week) and columns
@@ -11,10 +12,11 @@ export default class MonthView extends BasicView {
 
   // Overrides the default BasicView behavior to have special multi-week auto-height logic
   setGridHeight(height, isAuto) {
+    let slicer = (this.dayGrid.props as any).slicer as DayGridSlicer
 
     // if auto, make the height of each row the height that it would be if there were 6 weeks
     if (isAuto) {
-      height *= (this.dayGrid.props as any).dayTable.rowCnt / 6
+      height *= slicer.rowCnt / 6
     }
 
     distributeHeight(this.dayGrid.rowEls, height, !isAuto) // if auto, don't compensate for height-hogging rows

+ 0 - 185
src/component/DayTable.ts

@@ -1,185 +0,0 @@
-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.
-doesn't do any rendering.
-*/
-export default class DayTable {
-
-  daySeries: DaySeries
-  daysPerRow: any
-  isRtl: boolean
-  rowCnt: any
-  colCnt: any
-
-
-  // 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 daySeries = new DaySeries(dateProfile, dateProfileGenerator)
-    let { dates } = daySeries
-    let daysPerRow
-    let firstDay
-    let rowCnt
-
-    if (breakOnWeeks) {
-      // count columns until the day-of-week repeats
-      firstDay = dates[0].getUTCDay()
-      for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow++) {
-        if (dates[daysPerRow].getUTCDay() === firstDay) {
-          break
-        }
-      }
-      rowCnt = Math.ceil(dates.length / daysPerRow)
-    } else {
-      rowCnt = 1
-      daysPerRow = dates.length
-    }
-
-    this.daySeries = daySeries
-    this.daysPerRow = daysPerRow
-    this.isRtl = isRtl
-    this.rowCnt = rowCnt
-    this.colCnt = this.computeColCnt()
-  }
-
-
-  // Determines how many columns there should be in the table
-  computeColCnt() {
-    return this.daysPerRow
-  }
-
-
-  // Computes the DateMarker for the given cell
-  getCellDate(row, col): DateMarker {
-    return this.daySeries.dates[this.getCellDayIndex(row, col)]
-  }
-
-
-  // Computes the ambiguously-timed date range for the given cell
-  getCellRange(row, col): DateRange {
-    let start = this.getCellDate(row, col)
-    let end = addDays(start, 1)
-
-    return { start, end }
-  }
-
-
-  // Returns the number of day cells, chronologically, from the first of the grid (0-based)
-  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*
-  private getColDayIndex(col) {
-    if (this.isRtl) {
-      return this.colCnt - 1 - col
-    } else {
-      return col
-    }
-  }
-
-
-  /* Slicing
-  ------------------------------------------------------------------------------------------------------------------*/
-
-
-  // Slices up a date range into a segment for every week-row it intersects with
-  // range already normalized to start-of-day
-  sliceRangeByRow(range) {
-    let daysPerRow = this.daysPerRow
-    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
-    let rowLast // inclusive day-index range for current row
-    let segFirst
-    let segLast // inclusive day-index range for segment
-
-    for (row = 0; row < this.rowCnt; row++) {
-      rowFirst = row * daysPerRow
-      rowLast = rowFirst + daysPerRow - 1
-
-      // intersect segment's offset range with the row's
-      segFirst = Math.max(rangeFirst, rowFirst)
-      segLast = Math.min(rangeLast, rowLast)
-
-      // deal with in-between indices
-      segFirst = Math.ceil(segFirst) // in-between starts round to next cell
-      segLast = Math.floor(segLast) // in-between ends round to prev cell
-
-      if (segFirst <= segLast) { // was there any intersection with the current row?
-        segs.push({
-          row: row,
-
-          // normalize to start of row
-          firstRowDayIndex: segFirst - rowFirst,
-          lastRowDayIndex: segLast - rowFirst,
-
-          // must be matching integers to be the segment's start/end
-          isStart: segFirst === rangeFirst,
-          isEnd: segLast === rangeLast
-        })
-      }
-    }
-
-    return segs
-  }
-
-
-  // Slices up a date range into a segment for every day-cell it intersects with.
-  // range already normalized to start-of-day
-  // TODO: make more DRY with sliceRangeByRow somehow.
-  /*
-  sliceRangeByDay(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 segs = []
-    let row
-    let rowFirst
-    let rowLast // inclusive day-index range for current row
-    let i
-    let segFirst
-    let segLast // inclusive day-index range for segment
-
-    for (row = 0; row < this.rowCnt; row++) {
-      rowFirst = row * daysPerRow
-      rowLast = rowFirst + daysPerRow - 1
-
-      for (i = rowFirst; i <= rowLast; i++) {
-
-        // intersect segment's offset range with the row's
-        segFirst = Math.max(rangeFirst, i)
-        segLast = Math.min(rangeLast, i)
-
-        // deal with in-between indices
-        segFirst = Math.ceil(segFirst) // in-between starts round to next cell
-        segLast = Math.floor(segLast) // in-between ends round to prev cell
-
-        if (segFirst <= segLast) { // was there any intersection with the current row?
-          segs.push({
-            row: row,
-
-            // normalize to start of row
-            firstRowDayIndex: segFirst - rowFirst,
-            lastRowDayIndex: segLast - rowFirst,
-
-            // must be matching integers to be the segment's start/end
-            isStart: segFirst === rangeFirst,
-            isEnd: segLast === rangeLast
-          })
-        }
-      }
-    }
-
-    return segs
-  }
-  */
-
-}

+ 0 - 1
src/exports.ts

@@ -92,7 +92,6 @@ export { default as DateComponent, Seg } from './component/DateComponent'
 export { default as Calendar } from './Calendar'
 export { default as View } from './View'
 export { defineView, getViewConfig } from './ViewRegistry'
-export { default as DayTable } from './component/DayTable'
 export { default as FgEventRenderer } from './component/renderers/FgEventRenderer'
 export { default as FillRenderer } from './component/renderers/FillRenderer'
 export { default as AgendaView } from './agenda/AgendaView'