ソースを参照

progressiveEventRendering

Adam Shaw 7 年 前
コミット
a9f570ee64
5 ファイル変更20 行追加7 行削除
  1. 12 2
      src/Calendar.ts
  2. 1 1
      src/event-sources/func-event-source.ts
  3. 2 1
      src/main.ts
  4. 3 2
      src/reducers/main.ts
  5. 2 1
      src/reducers/types.ts

+ 12 - 2
src/Calendar.ts

@@ -29,7 +29,7 @@ import { EventInput, EventInstance, EventDef } from './structs/event'
 import { CalendarState, Action } from './reducers/types'
 import EventSourceApi from './api/EventSourceApi'
 import EventApi from './api/EventApi'
-import { parseEventStore } from './structs/event-store'
+import { parseEventStore, createEmptyEventStore, EventStore } from './structs/event-store'
 
 
 export default class Calendar {
@@ -85,6 +85,7 @@ export default class Calendar {
   isSkeletonRendered: boolean = false // fyi: set within the debounce delay
   renderingPauseDepth: number = 0
   rerenderFlags: RenderForceFlags
+  renderableEventStore: EventStore
   buildDelayedRerender: any
   delayedRerender: any
   afterSizingTriggers: any = {}
@@ -124,6 +125,7 @@ export default class Calendar {
   render() {
     if (!this.isDisplaying) {
       this.isDisplaying = true
+      this.renderableEventStore = createEmptyEventStore()
       this.bindGlobalHandlers()
       this.el.classList.add('fc')
       this._render()
@@ -336,6 +338,7 @@ export default class Calendar {
   buildInitialState(): CalendarState {
     return {
       loadingLevel: 0,
+      eventSourceLoadingLevel: 0,
       dateProfile: null,
       eventSources: {},
       eventStore: {
@@ -558,9 +561,16 @@ export default class Calendar {
       renderedView.addScroll(renderedView.queryScroll())
     }
 
+    // if event sources are still loading and progressive rendering hasn't been enabled,
+    // keep rendering the last fully loaded set of events
+    let renderableEventStore = this.renderableEventStore =
+      (state.eventSourceLoadingLevel && !this.opt('progressiveEventRendering')) ?
+        this.renderableEventStore :
+        state.eventStore
+
     renderedView.render({
       dateProfile: state.dateProfile,
-      eventStore: state.eventStore,
+      eventStore: renderableEventStore,
       businessHoursDef: renderedView.opt('businessHours'),
       dateSelection: state.dateSelection,
       eventSelection: state.eventSelection,

+ 1 - 1
src/event-sources/func-event-source.ts

@@ -28,7 +28,7 @@ registerEventSourceDef({
     let func = arg.eventSource.meta as EventSourceFunc
 
     unpromisify(
-      func.bind({ // the function returned from parseMeta
+      func.bind(null, { // the function returned from parseMeta
         start: dateEnv.toDate(arg.range.start),
         end: dateEnv.toDate(arg.range.end),
         timeZone: dateEnv.timeZone

+ 2 - 1
src/main.ts

@@ -6,8 +6,9 @@ import './basic/config'
 import './agenda/config'
 import './list/config'
 
-import './event-sources/json-feed-event-source'
 import './event-sources/array-event-source'
+import './event-sources/func-event-source'
+import './event-sources/json-feed-event-source'
 
 import './structs/recurring-event-simple'
 

+ 3 - 2
src/reducers/main.ts

@@ -22,7 +22,8 @@ export default function(state: CalendarState, action: Action, calendar: Calendar
     eventSelection: reduceSelectedEvent(state.eventSelection, action),
     eventDrag: reduceEventDrag(state.eventDrag, action),
     eventResize: reduceEventResize(state.eventResize, action),
-    loadingLevel: reduceLoadingLevel(state.loadingLevel, action, eventSources)
+    eventSourceLoadingLevel: reduceEventSourceLoadingLevel(state.eventSourceLoadingLevel, action, eventSources),
+    loadingLevel: reduceEventSourceLoadingLevel(state.loadingLevel, action, eventSources) // use same func
   }
 }
 
@@ -79,7 +80,7 @@ function reduceEventResize(currentEventResize: EventInteractionState | null, act
   }
 }
 
-function reduceLoadingLevel(level: number, action: Action, eventSources: EventSourceHash): number {
+function reduceEventSourceLoadingLevel(level: number, action: Action, eventSources: EventSourceHash): number {
   switch (action.type) {
     case 'FETCH_EVENT_SOURCES':
       return level + (action.sourceIds ? action.sourceIds.length : Object.keys(eventSources).length)

+ 2 - 1
src/reducers/types.ts

@@ -9,8 +9,9 @@ import { EventInteractionState } from '../interactions/event-interaction-state'
 import { DateSpan } from '../structs/date-span'
 
 export interface CalendarState extends DateComponentRenderState {
-  loadingLevel: number
   eventSources: EventSourceHash
+  eventSourceLoadingLevel: number
+  loadingLevel: number
 }
 
 export interface SimpleError {