Ver código fonte

more sane "context" properties

Adam Shaw 7 anos atrás
pai
commit
059adf27ae

+ 17 - 44
src/Calendar.ts

@@ -274,7 +274,7 @@ export default class Calendar {
 
   prev() {
     let view = this.view
-    let prevInfo = view.dateProfileGenerator.buildPrev(view.get('dateProfile'))
+    let prevInfo = view.dateProfileGenerator.buildPrev(view.dateProfile)
 
     if (prevInfo.isValid) {
       this.currentDate = prevInfo.date
@@ -285,7 +285,7 @@ export default class Calendar {
 
   next() {
     let view = this.view
-    let nextInfo = view.dateProfileGenerator.buildNext(view.get('dateProfile'))
+    let nextInfo = view.dateProfileGenerator.buildNext(view.dateProfile)
 
     if (nextInfo.isValid) {
       this.currentDate = nextInfo.date
@@ -486,39 +486,6 @@ export default class Calendar {
   }
 
 
-  // Render Queue
-  // -----------------------------------------------------------------------------------------------------------------
-
-
-  bindViewHandlers(view) {
-
-    view.watch('titleForCalendar', [ 'title' ], (deps) => { // TODO: better system
-      if (view === this.view) { // hack
-        this.setToolbarsTitle(deps.title)
-      }
-    })
-
-    view.watch('dateProfileForCalendar', [ 'dateProfile' ], (deps) => {
-      if (view === this.view) { // hack
-        let dateProfile = deps.dateProfile
-        this.currentDate = dateProfile.date // might have been constrained by view dates
-        this.updateToolbarButtons(dateProfile)
-
-        this.dispatch({
-          type: 'SET_ACTIVE_RANGE',
-          range: dateProfile.activeUnzonedRange
-        })
-      }
-    })
-  }
-
-
-  unbindViewHandlers(view) {
-    view.unwatch('titleForCalendar')
-    view.unwatch('dateProfileForCalendar')
-  }
-
-
   // View Rendering
   // -----------------------------------------------------------------------------------
 
@@ -542,9 +509,7 @@ export default class Calendar {
         this.viewsByType[viewType] ||
         (this.viewsByType[viewType] = this.instantiateView(viewType))
 
-      this.bindViewHandlers(newView)
-
-      newView.startBatchRender() // so that setElement+setDate rendering are joined
+      newView.startBatchRender() // so that setElement+setDateProfile rendering are joined
 
       let viewEl = createElement('div', { className: 'fc-view fc-' + viewType + '-view' })
       this.contentEl.appendChild(viewEl)
@@ -554,7 +519,17 @@ export default class Calendar {
     }
 
     if (this.view) {
-      this.view.setDate(this.currentDate)
+      let newDateProfile = this.view.computeNewDateProfile(this.currentDate)
+      if (newDateProfile) {
+        this.view.setDateProfile(newDateProfile)
+        this.setToolbarsTitle(this.view.title)
+        this.currentDate = newDateProfile.date // might have been constrained by view dates
+        this.updateToolbarButtons(newDateProfile)
+        this.dispatch({
+          type: 'SET_ACTIVE_RANGE',
+          range: newDateProfile.activeUnzonedRange
+        })
+      }
 
       if (newView) {
         newView.stopBatchRender()
@@ -572,10 +547,8 @@ export default class Calendar {
 
     this.toolbarsManager.proxyCall('deactivateButton', currentView.type)
 
-    this.unbindViewHandlers(currentView)
-
     currentView.removeElement()
-    currentView.unsetDate() // so bindViewHandlers doesn't fire with old values next time
+    currentView.unsetDateProfile()
 
     this.view = null
   }
@@ -789,8 +762,8 @@ export default class Calendar {
     let now = this.getNow()
     let view = this.view
     let todayInfo = view.dateProfileGenerator.build(now)
-    let prevInfo = view.dateProfileGenerator.buildPrev(view.get('dateProfile'))
-    let nextInfo = view.dateProfileGenerator.buildNext(view.get('dateProfile'))
+    let prevInfo = view.dateProfileGenerator.buildPrev(view.dateProfile)
+    let nextInfo = view.dateProfileGenerator.buildNext(view.dateProfile)
 
     this.toolbarsManager.proxyCall(
       (todayInfo.isValid && !dateProfile.currentUnzonedRange.containsDate(now)) ?

+ 30 - 36
src/View.ts

@@ -4,7 +4,7 @@ import { isPrimaryMouseButton } from './util/dom-event'
 import { parseFieldSpecs } from './util/misc'
 import RenderQueue from './common/RenderQueue'
 import Calendar from './Calendar'
-import DateProfileGenerator from './DateProfileGenerator'
+import DateProfileGenerator, { DateProfile } from './DateProfileGenerator'
 import InteractiveDateComponent from './component/InteractiveDateComponent'
 import GlobalEmitter from './common/GlobalEmitter'
 import UnzonedRange from './models/UnzonedRange'
@@ -27,6 +27,7 @@ export default abstract class View extends InteractiveDateComponent {
   calendar: Calendar // owner Calendar object
   viewSpec: any
   options: any // hash containing all options. already merged with view-specific-options
+  dateProfile: DateProfile
 
   renderQueue: RenderQueue
   batchRenderDepth: number = 0
@@ -86,11 +87,6 @@ export default abstract class View extends InteractiveDateComponent {
   }
 
 
-  _getView() {
-    return this
-  }
-
-
   // Retrieves an option with the given name
   opt(name) {
     return this.options[name]
@@ -163,7 +159,7 @@ export default abstract class View extends InteractiveDateComponent {
 
   // Computes what the title at the top of the calendar should be for this view
   computeTitle(dateProfile) {
-    const dateEnv = this.calendar.dateEnv
+    let dateEnv = this.getDateEnv()
     let unzonedRange
 
     // for views that span a large unit of time, show the proper interval, ignoring stray days before and after
@@ -221,21 +217,37 @@ export default abstract class View extends InteractiveDateComponent {
   // -----------------------------------------------------------------------------------------------------------------
 
 
-  setDate(date: DateMarker) {
-    let currentDateProfile = this.get('dateProfile')
+  computeNewDateProfile(date: DateMarker) {
+    let currentDateProfile = this.dateProfile
     let newDateProfile = this.dateProfileGenerator.build(date, undefined, true) // forceToValid=true
 
     if (
       !currentDateProfile ||
       !currentDateProfile.activeUnzonedRange.equals(newDateProfile.activeUnzonedRange)
     ) {
-      this.set('dateProfile', newDateProfile)
+      return newDateProfile
     }
   }
 
 
-  unsetDate() {
+  setDateProfile(dateProfile) {
+    let dateEnv = this.getDateEnv()
+
+    this.title = this.computeTitle(dateProfile)
+    // DEPRECATED, but we need to keep it updated...
+    this.start = dateEnv.toDate(dateProfile.activeUnzonedRange.start)
+    this.end = dateEnv.toDate(dateProfile.activeUnzonedRange.end)
+    this.intervalStart = dateEnv.toDate(dateProfile.currentUnzonedRange.start)
+    this.intervalEnd = dateEnv.toDate(dateProfile.currentUnzonedRange.end)
+
+    this.dateProfile = dateProfile
+    this.set('dateProfile', dateProfile) // for rendering watchers
+  }
+
+
+  unsetDateProfile() {
     this.unset('dateProfile')
+    this.dateProfile = null
   }
 
 
@@ -243,9 +255,9 @@ export default abstract class View extends InteractiveDateComponent {
   // -----------------------------------------------------------------------------------------------------------------
 
 
-  requestDateRender(dateProfile) {
+  requestDateRender() {
     this.requestRender(() => {
-      this.executeDateRender(dateProfile)
+      this.executeDateRender()
     }, 'date', 'init')
   }
 
@@ -258,8 +270,8 @@ export default abstract class View extends InteractiveDateComponent {
 
 
   // if dateProfile not specified, uses current
-  executeDateRender(dateProfile) {
-    super.executeDateRender(dateProfile)
+  executeDateRender() {
+    super.executeDateRender()
 
     if (this['render']) {
       this['render']() // TODO: deprecate
@@ -391,7 +403,7 @@ export default abstract class View extends InteractiveDateComponent {
   // which is defined by this.getNowIndicatorUnit().
   // TODO: somehow do this for the current whole day's background too
   startNowIndicator() {
-    const dateEnv = this.calendar.dateEnv
+    let dateEnv = this.getDateEnv()
     let unit
     let update
     let delay // ms wait value
@@ -565,7 +577,7 @@ export default abstract class View extends InteractiveDateComponent {
 
   // Triggers handlers to 'select'
   triggerSelect(selection: Selection, ev?) {
-    const dateEnv = this.calendar.dateEnv
+    let dateEnv = this.getDateEnv()
 
     this.publiclyTrigger('select', [
       {
@@ -820,7 +832,7 @@ View.prototype.dateProfileGeneratorClass = DateProfileGenerator
 
 
 View.watch('displayingDates', [ 'isInDom', 'dateProfile' ], function(deps) {
-  this.requestDateRender(deps.dateProfile)
+  this.requestDateRender()
 }, function() {
   this.requestDateUnrender()
 })
@@ -838,21 +850,3 @@ View.watch('displayingEvents', [ 'displayingDates', 'eventStore' ], function(dep
 }, function() {
   this.requestUnrenderEvents()
 })
-
-
-View.watch('title', [ 'dateProfile' ], function(deps) {
-  return (this.title = this.computeTitle(deps.dateProfile)) // assign to View for legacy reasons
-})
-
-
-View.watch('legacyDateProps', [ 'dateProfile' ], function(deps) {
-  let calendar = this.calendar
-  let dateEnv = calendar.dateEnv
-  let dateProfile = deps.dateProfile
-
-  // DEPRECATED, but we need to keep it updated...
-  this.start = dateEnv.toDate(dateProfile.activeUnzonedRange.start)
-  this.end = dateEnv.toDate(dateProfile.activeUnzonedRange.end)
-  this.intervalStart = dateEnv.toDate(dateProfile.currentUnzonedRange.start)
-  this.intervalEnd = dateEnv.toDate(dateProfile.currentUnzonedRange.end)
-})

+ 2 - 2
src/agenda/AgendaView.ts

@@ -122,7 +122,7 @@ export default class AgendaView extends View {
   // Builds the HTML skeleton for the view.
   // The day-grid and time-grid components will render inside containers defined by this HTML.
   renderSkeletonHtml() {
-    let theme = this.calendar.theme
+    let theme = this.getTheme()
 
     return '' +
       '<table class="' + theme.getClass('tableGrid') + '">' +
@@ -357,7 +357,7 @@ agendaTimeGridMethods = {
     let view = this.view
     let calendar = view.calendar
     let dateEnv = calendar.dateEnv
-    let weekStart = this.dateProfile.renderUnzonedRange.start
+    let weekStart = this.getDateProfile().renderUnzonedRange.start
     let weekText
 
     if (this.opt('weekNumbers')) {

+ 10 - 12
src/agenda/TimeGrid.ts

@@ -197,8 +197,7 @@ export default class TimeGrid extends InteractiveDateComponent {
   ------------------------------------------------------------------------------------------------------------------*/
 
 
-  renderDates(dateProfile) {
-    this.dateProfile = dateProfile
+  renderDates() {
     this.updateDayTable()
     this.renderSlats()
     this.renderColumns()
@@ -212,7 +211,7 @@ export default class TimeGrid extends InteractiveDateComponent {
 
 
   renderSkeleton() {
-    let theme = this.view.calendar.theme
+    let theme = this.getTheme()
 
     this.el.innerHTML =
       '<div class="fc-bg"></div>' +
@@ -226,7 +225,7 @@ export default class TimeGrid extends InteractiveDateComponent {
 
 
   renderSlats() {
-    let theme = this.view.calendar.theme
+    let theme = this.getTheme()
 
     this.slatContainerEl.innerHTML =
       '<table class="' + theme.getClass('tableGrid') + '">' +
@@ -245,11 +244,10 @@ export default class TimeGrid extends InteractiveDateComponent {
   // Generates the HTML for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL.
   renderSlatRowHtml() {
     let view = this.view
-    let calendar = view.calendar
-    let dateEnv = calendar.dateEnv
-    let theme = calendar.theme
+    let dateEnv = this.getDateEnv()
+    let theme = this.getTheme()
     let isRTL = this.isRTL
-    let dateProfile = this.dateProfile
+    let dateProfile = this.getDateProfile()
     let html = ''
     let dayStart = startOfDay(dateProfile.renderUnzonedRange.start)
     let slotTime = dateProfile.minTime
@@ -291,9 +289,9 @@ export default class TimeGrid extends InteractiveDateComponent {
 
 
   renderColumns() {
-    let dateProfile = this.dateProfile
-    let theme = this.view.calendar.theme
-    const dateEnv = this.view.calendar.dateEnv
+    let dateProfile = this.getDateProfile()
+    let theme = this.getTheme()
+    let dateEnv = this.getDateEnv()
 
     this.dayRanges = this.dayDates.map(function(dayDate) {
       return new UnzonedRange(
@@ -506,7 +504,7 @@ export default class TimeGrid extends InteractiveDateComponent {
   // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).
   computeTimeTop(timeMs: number) {
     let len = this.slatEls.length
-    let dateProfile = this.dateProfile
+    let dateProfile = this.getDateProfile()
     let slatCoverage = (timeMs - asRoughMs(dateProfile.minTime)) / asRoughMs(this.slotDuration) // floating-point value of # of slots covered
     let slatIndex
     let slatRemainder

+ 7 - 5
src/basic/BasicView.ts

@@ -70,10 +70,12 @@ export default class BasicView extends View {
   }
 
 
-  executeDateRender(dateProfile) {
-    this.dayGrid.breakOnWeeks = /year|month|week/.test(dateProfile.currentRangeUnit)
+  executeDateRender() {
+    this.dayGrid.breakOnWeeks = /year|month|week/.test(
+      this.getDateProfile().currentRangeUnit
+    )
 
-    super.executeDateRender(dateProfile)
+    super.executeDateRender()
   }
 
 
@@ -107,7 +109,7 @@ export default class BasicView extends View {
   // Builds the HTML skeleton for the view.
   // The day-grid component will render inside of a container defined by this HTML.
   renderSkeletonHtml() {
-    let theme = this.calendar.theme
+    let theme = this.getTheme()
 
     return '' +
       '<table class="' + theme.getClass('tableGrid') + '">' +
@@ -295,7 +297,7 @@ function makeDayGridSubclass(SuperClass) {
     // Generates the HTML that will go before content-skeleton cells that display the day/week numbers
     renderNumberIntroHtml(row) {
       let view = this.view
-      const dateEnv = view.calendar.dateEnv
+      let dateEnv = this.getDateEnv()
       let weekStart = this.getCellDate(row, 0)
 
       if (view.colWeekNumbersVisible) {

+ 1 - 1
src/basic/BasicViewDateProfileGenerator.ts

@@ -7,7 +7,7 @@ export default class BasicViewDateProfileGenerator extends DateProfileGenerator
 
   // Computes the date range that will be rendered.
   buildRenderRange(currentUnzonedRange, currentRangeUnit, isRangeAllDay) {
-    const dateEnv = this._view.calendar.dateEnv
+    let dateEnv = this._view.calendar.dateEnv
     let renderUnzonedRange = super.buildRenderRange(currentUnzonedRange, currentRangeUnit, isRangeAllDay) // an UnzonedRange
     let start = renderUnzonedRange.start
     let end = renderUnzonedRange.end

+ 8 - 10
src/basic/DayGrid.ts

@@ -100,8 +100,7 @@ export default class DayGrid extends InteractiveDateComponent {
   ------------------------------------------------------------------------------------------------------------------*/
 
 
-  renderDates(dateProfile) {
-    this.dateProfile = dateProfile
+  renderDates() {
     this.updateDayTable()
     this.renderGrid()
   }
@@ -115,7 +114,7 @@ export default class DayGrid extends InteractiveDateComponent {
   // Renders the rows and columns into the component's `this.el`, which should already be assigned.
   renderGrid() {
     let view = this.view
-    const dateEnv = view.calendar.dateEnv
+    let dateEnv = this.getDateEnv()
     let rowCnt = this.rowCnt
     let colCnt = this.colCnt
     let html = ''
@@ -162,7 +161,7 @@ export default class DayGrid extends InteractiveDateComponent {
   // Generates the HTML for a single row, which is a div that wraps a table.
   // `row` is the row number.
   renderDayRowHtml(row, isRigid) {
-    let theme = this.view.calendar.theme
+    let theme = this.getTheme()
     let classes = [ 'fc-row', 'fc-week', theme.getClass('dayRow') ]
 
     if (isRigid) {
@@ -237,9 +236,9 @@ export default class DayGrid extends InteractiveDateComponent {
   // The number row will only exist if either day numbers or week numbers are turned on.
   renderNumberCellHtml(date) {
     let view = this.view
-    const dateEnv = view.calendar.dateEnv
+    let dateEnv = this.getDateEnv()
     let html = ''
-    let isDateValid = this.dateProfile.activeUnzonedRange.containsDate(date) // TODO: called too frequently. cache somehow.
+    let isDateValid = this.getDateProfile().activeUnzonedRange.containsDate(date) // TODO: called too frequently. cache somehow.
     let isDayNumberVisible = this.getIsDayNumbersVisible() && isDateValid
     let classes
     let weekCalcFirstDow
@@ -540,7 +539,7 @@ export default class DayGrid extends InteractiveDateComponent {
   // Responsible for attaching click handler as well.
   renderMoreLink(row, col, hiddenSegs) {
     let view = this.view
-    const dateEnv = view.calendar.dateEnv
+    let dateEnv = this.getDateEnv()
 
     let a = createElement('a', { className: 'fc-more' })
     a.innerText = this.getMoreLinkText(hiddenSegs.length)
@@ -635,9 +634,8 @@ export default class DayGrid extends InteractiveDateComponent {
 
   // Builds the inner DOM contents of the segment popover
   renderSegPopoverContent(row, col, segs): ElementContent {
-    let view = this.view
-    const dateEnv = view.calendar.dateEnv
-    let theme = view.calendar.theme
+    let theme = this.getTheme()
+    let dateEnv = this.getDateEnv()
     let title = dateEnv.format(
       this.getCellDate(row, col),
       createFormatter(this.opt('dayPopoverFormat')) // TODO: cache

+ 1 - 1
src/basic/MonthView.ts

@@ -22,7 +22,7 @@ export default class MonthView extends BasicView {
 
 
   isDateInOtherMonth(date: DateMarker, dateProfile) {
-    const dateEnv = this.calendar.dateEnv
+    let dateEnv = this.getDateEnv()
 
     return dateEnv.getMonth(date) !== dateEnv.getMonth(dateProfile.currentUnzonedRange.start)
   }

+ 31 - 29
src/component/DateComponent.ts

@@ -11,6 +11,8 @@ import UnzonedRange from '../models/UnzonedRange'
 import { Seg } from '../reducers/seg'
 import { EventStore } from '../reducers/event-store'
 import { BusinessHourDef, buildBusinessHourEventStore } from '../reducers/business-hours'
+import { DateEnv } from '../datelib/env'
+import Theme from '../theme/Theme'
 
 
 export default abstract class DateComponent extends Component {
@@ -26,7 +28,7 @@ export default abstract class DateComponent extends Component {
   childrenByUid: any
   isRTL: boolean = false // frequently accessed options
   nextDayThreshold: Duration // "
-  dateProfile: DateProfile // hack
+  view: View
 
   eventRenderer: any
   helperRenderer: any
@@ -38,13 +40,11 @@ export default abstract class DateComponent extends Component {
   isDatesRendered: boolean = false
 
 
-  constructor(_view?, _options?) {
+  constructor(_view, _options?) {
     super()
 
     // hack to set options prior to the this.opt calls
-    if (_view) {
-      this['view'] = _view
-    }
+    this.view = _view || this
     if (_options) {
       this['options'] = _options
     }
@@ -107,19 +107,19 @@ export default abstract class DateComponent extends Component {
 
 
   opt(name) {
-    return this._getView().opt(name) // default implementation
+    return this.view.options[name]
   }
 
 
   publiclyTrigger(...args) {
-    let calendar = this._getCalendar()
+    let calendar = this.getCalendar()
 
     return calendar.publiclyTrigger.apply(calendar, args)
   }
 
 
   hasPublicHandlers(...args) {
-    let calendar = this._getCalendar()
+    let calendar = this.getCalendar()
 
     return calendar.hasPublicHandlers.apply(calendar, args)
   }
@@ -129,9 +129,8 @@ export default abstract class DateComponent extends Component {
   // -----------------------------------------------------------------------------------------------------------------
 
 
-  executeDateRender(dateProfile) {
-    this.dateProfile = dateProfile // for rendering
-    this.renderDates(dateProfile)
+  executeDateRender() {
+    this.renderDates()
     this.isDatesRendered = true
     this.callChildren('executeDateRender', arguments)
   }
@@ -139,14 +138,13 @@ export default abstract class DateComponent extends Component {
 
   executeDateUnrender() { // wrapper
     this.callChildren('executeDateUnrender', arguments)
-    this.dateProfile = null
     this.unrenderDates()
     this.isDatesRendered = false
   }
 
 
   // date-cell content only
-  renderDates(dateProfile) {
+  renderDates() {
     // subclasses should implement
   }
 
@@ -191,8 +189,8 @@ export default abstract class DateComponent extends Component {
           buildBusinessHourEventStore(
             businessHoursDef,
             this.hasAllDayBusinessHours,
-            this.dateProfile.activeUnzonedRange,
-            this._getCalendar()
+            this.getDateProfile().activeUnzonedRange,
+            this.getCalendar()
           )
         )
       )
@@ -485,7 +483,7 @@ export default abstract class DateComponent extends Component {
 
 
   eventStoreToSegs(eventStore: EventStore): Seg[] {
-    let activeUnzonedRange = this.dateProfile.activeUnzonedRange
+    let activeUnzonedRange = this.getDateProfile().activeUnzonedRange
     let eventRenderRanges = sliceEventStore(eventStore, activeUnzonedRange)
     let allSegs: Seg[] = []
 
@@ -534,19 +532,23 @@ export default abstract class DateComponent extends Component {
   }
 
 
-  _getCalendar(): Calendar { // TODO: strip out. move to generic parent.
-    let t = (this as any)
-    return t.calendar || t.view.calendar
+  getCalendar(): Calendar {
+    return this.view.calendar
+  }
+
+
+  getDateEnv(): DateEnv {
+    return this.getCalendar().dateEnv
   }
 
 
-  _getView(): View { // TODO: strip out. move to generic parent.
-    return (this as any).view
+  getDateProfile(): DateProfile {
+    return this.view.dateProfile
   }
 
 
-  _getDateProfile(): DateProfile {
-    return this._getView().get('dateProfile')
+  getTheme(): Theme {
+    return this.getCalendar().theme
   }
 
 
@@ -557,7 +559,7 @@ export default abstract class DateComponent extends Component {
   // `type` is a view-type like "day" or "week". default value is "day".
   // `attrs` and `innerHtml` are use to generate the rest of the HTML tag.
   buildGotoAnchorHtml(gotoOptions, attrs, innerHtml) {
-    const dateEnv = this._getCalendar().dateEnv
+    let dateEnv = this.getDateEnv()
     let date
     let type
     let forceOff
@@ -605,17 +607,17 @@ export default abstract class DateComponent extends Component {
 
   // Computes HTML classNames for a single-day element
   getDayClasses(date: DateMarker, noThemeHighlight?) {
-    let view = this._getView()
+    let view = this.view
     let classes = []
     let todayStart: DateMarker
     let todayEnd: DateMarker
 
-    if (!this.dateProfile.activeUnzonedRange.containsDate(date)) {
+    if (!this.getDateProfile().activeUnzonedRange.containsDate(date)) {
       classes.push('fc-disabled-day') // TODO: jQuery UI theme?
     } else {
       classes.push('fc-' + DAY_IDS[date.getUTCDay()])
 
-      if (view.isDateInOtherMonth(date, this.dateProfile)) { // TODO: use DateComponent subclass somehow
+      if (view.isDateInOtherMonth(date, this.getDateProfile())) { // TODO: use DateComponent subclass somehow
         classes.push('fc-other-month')
       }
 
@@ -643,8 +645,8 @@ export default abstract class DateComponent extends Component {
   // Won't go more precise than days.
   // Will return `0` if there's not a clean whole interval.
   currentRangeAs(unit) { // PLURAL :(
-    const dateEnv = this._getCalendar().dateEnv
-    let range = this._getDateProfile().currentUnzonedRange
+    let dateEnv = this.getDateEnv()
+    let range = this.getDateProfile().currentUnzonedRange
     let res = null
 
     if (unit === 'years') {

+ 10 - 8
src/component/DayTableMixin.ts

@@ -40,8 +40,9 @@ export default class DayTableMixin extends Mixin implements DayTableInterface {
   updateDayTable() {
     let t = (this as any)
     let view = t.view
-    let date: DateMarker = t.dateProfile.renderUnzonedRange.start
-    let end: DateMarker = t.dateProfile.renderUnzonedRange.end
+    let dateProfile = t.getDateProfile()
+    let date: DateMarker = dateProfile.renderUnzonedRange.start
+    let end: DateMarker = dateProfile.renderUnzonedRange.end
     let dayIndex = -1
     let dayIndices = []
     let dayDates: DateMarker[] = []
@@ -270,7 +271,7 @@ export default class DayTableMixin extends Mixin implements DayTableInterface {
 
 
   renderHeadHtml() {
-    let theme = (this as any).view.calendar.theme
+    let theme = (this as any).getTheme()
 
     return '' +
       '<div class="fc-row ' + theme.getClass('headerRow') + '">' +
@@ -317,9 +318,9 @@ export default class DayTableMixin extends Mixin implements DayTableInterface {
   renderHeadDateCellHtml(date: DateMarker, colspan, otherAttrs) {
     let t = (this as any)
     let view = t.view
-    let calendar = view.calendar
-    let dateEnv = calendar.dateEnv
-    let isDateValid = t.dateProfile.activeUnzonedRange.containsDate(date) // TODO: called too frequently. cache somehow.
+    let dateEnv = t.getDateEnv()
+    let dateProfile = t.getDateProfile()
+    let isDateValid = dateProfile.activeUnzonedRange.containsDate(date) // TODO: called too frequently. cache somehow.
     let classNames = [
       'fc-day-header',
       view.calendar.theme.getClass('widgetHeader')
@@ -408,8 +409,9 @@ export default class DayTableMixin extends Mixin implements DayTableInterface {
   renderBgCellHtml(date: DateMarker, otherAttrs) {
     let t = (this as any)
     let view = t.view
-    const dateEnv = view.calendar.dateEnv
-    let isDateValid = t.dateProfile.activeUnzonedRange.containsDate(date) // TODO: called too frequently. cache somehow.
+    let dateEnv = t.getDateEnv()
+    let dateProfile = t.getDateProfile()
+    let isDateValid = dateProfile.activeUnzonedRange.containsDate(date) // TODO: called too frequently. cache somehow.
     let classes = t.getDayClasses(date)
 
     classes.unshift('fc-day', view.calendar.theme.getClass('widgetContent'))

+ 2 - 2
src/component/InteractiveDateComponent.ts

@@ -102,7 +102,7 @@ export default abstract class InteractiveDateComponent extends DateComponent {
 
 
   shouldIgnoreTouch() {
-    let view = this._getView()
+    let view = this.view
 
     // On iOS (and Android?) when a new selection is initiated overtop another selection,
     // the touchend never fires because the elements gets removed mid-touch-interaction (my theory).
@@ -136,7 +136,7 @@ export default abstract class InteractiveDateComponent extends DateComponent {
 
 
   canStartResize(seg, ev) {
-    let view = this._getView()
+    let view = this.view
     let eventDef = seg.eventRange.eventDef
 
     return (!getEvIsTouch(ev) || view.isEventDefSelected(eventDef)) &&

+ 1 - 1
src/component/renderers/EventRenderer.ts

@@ -23,7 +23,7 @@ export default class EventRenderer {
 
 
   constructor(component, fillRenderer) { // fillRenderer is optional
-    this.view = component._getView()
+    this.view = component.view
     this.component = component
     this.fillRenderer = fillRenderer
   }

+ 1 - 1
src/component/renderers/HelperRenderer.ts

@@ -11,7 +11,7 @@ export default abstract class HelperRenderer {
 
 
   constructor(component, eventRenderer) {
-    this.view = component._getView()
+    this.view = component.view
     this.component = component
     this.eventRenderer = eventRenderer
   }

+ 4 - 3
src/list/ListView.ts

@@ -73,7 +73,8 @@ export default class ListView extends View {
   }
 
 
-  renderDates(dateProfile) {
+  renderDates() {
+    let dateProfile = this.getDateProfile()
     let dayStart = startOfDay(dateProfile.renderUnzonedRange.start)
     let viewEnd = dateProfile.renderUnzonedRange.end
     let dayDates = []
@@ -100,7 +101,7 @@ export default class ListView extends View {
 
   // slices by day
   rangeToSegs(range: UnzonedRange, isAllDay: boolean) {
-    const dateEnv = this.calendar.dateEnv
+    let dateEnv = this.getDateEnv()
     let dayRanges = this.dayRanges
     let dayIndex
     let segRange
@@ -203,7 +204,7 @@ export default class ListView extends View {
 
   // generates the HTML for the day headers that live amongst the event rows
   buildDayHeaderRow(dayDate) {
-    const dateEnv = this.calendar.dateEnv
+    let dateEnv = this.getDateEnv()
     let mainFormat = createFormatter(this.opt('listDayFormat')) // TODO: cache
     let altFormat = createFormatter(this.opt('listDayAltFormat')) // TODO: cache