Sfoglia il codice sorgente

fixes for View classes

Adam Shaw 7 anni fa
parent
commit
2df6e7d670

+ 21 - 11
src/View.ts

@@ -9,7 +9,7 @@ import { createElement } from './util/dom-manip'
 import { ComponentContext } from './component/Component'
 import DateComponent from './component/DateComponent'
 import { EventStore } from './structs/event-store'
-import { EventUiHash } from './component/event-rendering'
+import { EventUiHash, sliceEventStore } from './component/event-rendering'
 import { DateSpan } from './structs/date-span'
 import { EventInteractionUiState } from './interactions/event-interaction-state'
 
@@ -112,7 +112,7 @@ export default abstract class View extends DateComponent<ViewProps> {
     this.subrender('afterSkeletonRender', [], 'beforeSkeletonUnrender', true)
     let dateId = this.subrender('_renderDates', [ props.dateProfile ], '_unrenderDates', true)
     this.subrender('renderBusinessHours', [ props.businessHours, props.dateProfile, dateId ], 'unrenderBusinessHours', true)
-    this.subrender('renderDateSelectionState', [ props.dateSelection, dateId ], 'unrenderDateSelectionState', true)
+    this.subrender('renderDateSelectionState', [ props.dateSelection, dateId ], 'unrenderDateSelection', true)
     let evId = this.subrender('renderEvents', [ props.eventStore, props.eventUis, dateId ], 'unrenderEvents', true)
     this.subrender('renderEventSelection', [ props.eventSelection, evId ], 'unrenderEventSelection', true)
     this.subrender('renderEventDragState', [ props.eventDrag, dateId ], 'unrenderEventDragState', true)
@@ -131,18 +131,9 @@ export default abstract class View extends DateComponent<ViewProps> {
 
   renderDates(dateProfile: DateProfile) {}
   unrenderDates() {}
-
   renderBusinessHours(businessHours: EventStore) {}
-  unrenderBusinessHours() {}
-
-  renderDateSelectionState(selection: DateSpan) {}
-  unrenderDateSelectionState() {}
-
   renderEvents(eventStore: EventStore, eventUis: EventUiHash) {}
-  unrenderEvents() {}
-
   renderEventSelection(instanceId: string) {}
-  unrenderEventSelection() {}
 
   renderEventDragState(state: EventInteractionUiState) {}
   unrenderEventDragState() {}
@@ -150,6 +141,25 @@ export default abstract class View extends DateComponent<ViewProps> {
   renderEventResizeState(state: EventInteractionUiState) {}
   unrenderEventResizeState() {}
 
+  renderDateSelectionState(selection: DateSpan) {
+    if (selection) {
+      this.renderDateSelection(selection)
+    }
+  }
+
+  renderDateSelection(selection: DateSpan) {
+  }
+
+  // util for subclasses
+  sliceEvents(eventStore: EventStore, eventUis: EventUiHash, allDay: boolean) {
+    return sliceEventStore(
+      eventStore,
+      eventUis,
+      this.props.dateProfile.activeRange,
+      allDay ? this.nextDayThreshold : null
+    )
+  }
+
 
   // Sizing
   // -----------------------------------------------------------------------------------------------------------------

+ 5 - 7
tests/automated/legacy/custom-view-class.js

@@ -4,10 +4,6 @@ describe('custom view class', function() {
 
     class CustomView extends FullCalendar.View {
 
-      initialize() {
-        this.slicingType = 'all-day' // should really do this in the constructor
-      }
-
       renderDates(dateProfile) {
         expect(dateProfile.activeRange.start instanceof Date).toBe(true)
         expect(dateProfile.activeRange.end instanceof Date).toBe(true)
@@ -18,7 +14,9 @@ describe('custom view class', function() {
         expect(typeof isAuto).toBe('boolean')
       }
 
-      renderEventRanges(eventRanges) {
+      renderEvents(eventStore, eventUis) {
+        let eventRanges = this.sliceEvents(eventStore, eventUis, true) // allDay=true
+
         expect(Array.isArray(eventRanges)).toBe(true)
         expect(eventRanges.length).toBe(1)
         expect(typeof eventRanges[0].def).toBe('object')
@@ -48,7 +46,7 @@ describe('custom view class', function() {
     spyOn(CustomView.prototype, 'initialize').and.callThrough()
     spyOn(CustomView.prototype, 'renderDates').and.callThrough()
     spyOn(CustomView.prototype, 'updateSize').and.callThrough()
-    spyOn(CustomView.prototype, 'renderEventRanges').and.callThrough()
+    spyOn(CustomView.prototype, 'renderEvents').and.callThrough()
     spyOn(CustomView.prototype, 'unrenderEvents').and.callThrough()
     spyOn(CustomView.prototype, 'renderDateSelection').and.callThrough()
     spyOn(CustomView.prototype, 'unrenderDateSelection').and.callThrough()
@@ -70,7 +68,7 @@ describe('custom view class', function() {
     expect(CustomView.prototype.initialize).toHaveBeenCalled()
     expect(CustomView.prototype.renderDates).toHaveBeenCalled()
     expect(CustomView.prototype.updateSize).toHaveBeenCalled()
-    expect(CustomView.prototype.renderEventRanges).toHaveBeenCalled()
+    expect(CustomView.prototype.renderEvents).toHaveBeenCalled()
 
     currentCalendar.rerenderEvents()
 

+ 17 - 8
tests/automated/performance/rerenders.js

@@ -11,28 +11,37 @@ describe('rerender performance', function() {
 
   [
     {
-      classes: [ 'MonthView', 'DayGrid' ],
       defaultView: 'month',
+      classes: [
+        { name: 'MonthView', dateMethod: 'renderDates', eventMethod: 'renderEvents' },
+        { name: 'DayGrid', dateMethod: 'renderCells', eventMethod: 'renderEventSegs' }
+      ],
       changeToView: 'list' // does not have DayGrid!
     },
     {
-      classes: [ 'AgendaView', 'DayGrid', 'TimeGrid' ],
       defaultView: 'agendaWeek',
+      classes: [
+        { name: 'AgendaView', dateMethod: 'renderDates', eventMethod: 'renderEvents' },
+        { name: 'DayGrid', dateMethod: 'renderCells', eventMethod: 'renderEventSegs' },
+        { name: 'TimeGrid', dateMethod: 'renderColumns', eventMethod: 'renderEventSegs' }
+      ],
       changeToView: 'list' // does not have DayGrid!
     },
     {
-      classes: [ 'ListView' ],
       defaultView: 'listWeek',
+      classes: [
+        { name: 'ListView', dateMethod: 'renderDates', eventMethod: 'renderEvents' },
+      ],
       changeToView: 'month'
     }
   ].forEach(function(settings) {
-    settings.classes.forEach(function(className) {
-      describe('for ' + className + ' in ' + settings.defaultView + ' view', function() {
-        var Class = FullCalendar[className]
+    settings.classes.forEach(function(classInfo) {
+      describe('for ' + classInfo.name + ' in ' + settings.defaultView + ' view', function() {
+        var Class = FullCalendar[classInfo.name]
 
         it('calls methods a limited number of times', function(done) {
-          var renderDates = spyOnMethod(Class, 'renderDates')
-          var renderEvents = spyOnMethod(Class, 'renderEvents')
+          var renderDates = spyOnMethod(Class, classInfo.dateMethod)
+          var renderEvents = spyOnMethod(Class, classInfo.eventMethod)
           var updateSize = spyOnMethod(Class, 'updateSize')
 
           initCalendar({