فهرست منبع

fix empty businesshours eventrange

Adam Shaw 8 سال پیش
والد
کامیت
c101c5a9d0
4فایلهای تغییر یافته به همراه48 افزوده شده و 17 حذف شده
  1. 28 12
      src/Calendar.business.js
  2. 5 1
      src/Calendar.constraints.js
  3. 11 4
      src/common/Grid.events.js
  4. 4 0
      src/models/event/EventRangeGroup.js

+ 28 - 12
src/Calendar.business.js

@@ -8,28 +8,44 @@ var BUSINESS_HOUR_EVENT_DEFAULTS = {
 };
 
 
+/*
+See note on buildBusinessRangeGroup about return value.
+*/
 Calendar.prototype.buildCurrentBusinessRangeGroup = function(wholeDay) {
 	var eventPeriod = this.eventManager.currentPeriod;
 
-	return this.buildBusinessRangeGroup(
-		wholeDay,
-		this.opt('businessHours'),
-		eventPeriod.start,
-		eventPeriod.end
-	);
+	if (eventPeriod) {
+		return this.buildBusinessRangeGroup(
+			wholeDay,
+			this.opt('businessHours'),
+			eventPeriod.start,
+			eventPeriod.end
+		);
+	}
 };
 
 
+/*
+If there are business hours, and they are within range, returns populated EventRangeGroup.
+If there are business hours, but they aren't within range, returns a zero-item EventRangeGroup.
+If there are NOT business hours, returns undefined.
+*/
 Calendar.prototype.buildBusinessRangeGroup = function(wholeDay, rawComplexDef, rangeStart, rangeEnd) {
 	var eventDefs = this.buildBusinessDefs(wholeDay, rawComplexDef);
-	var eventInstances = eventDefsToEventInstances(eventDefs, rangeStart, rangeEnd);
-	var eventRanges = eventInstancesToEventRanges(eventInstances);
-	var eventRangeGroup = new EventRangeGroup(eventRanges);
+	var eventInstances;
+	var eventRanges;
+	var eventRangeGroup;
 
-	// so that inverse-background rendering can happen even when no eventRanges in view
-	eventRangeGroup.explicitEventDef = eventDefs[0];
+	if (eventDefs.length) {
+		eventInstances = eventDefsToEventInstances(eventDefs, rangeStart, rangeEnd);
+		eventRanges = eventInstancesToEventRanges(eventInstances);
+		eventRangeGroup = new EventRangeGroup(eventRanges);
 
-	return eventRangeGroup;
+		// so that inverse-background rendering can happen even when no eventRanges in view
+		eventRangeGroup.explicitEventDef = eventDefs[0];
+
+		return eventRangeGroup;
+	}
 };
 
 

+ 5 - 1
src/Calendar.constraints.js

@@ -115,10 +115,14 @@ Calendar.prototype.isFootprintWithinConstraints = function(componentFootprint, c
 
 
 Calendar.prototype.constraintValToFootprints = function(constraintVal, isAllDay) {
+	var eventRangeGroup;
 	var eventRanges = [];
 
 	if (constraintVal === 'businessHours') {
-		eventRanges = this.buildCurrentBusinessRangeGroup(isAllDay).eventRanges;
+		eventRangeGroup = this.buildCurrentBusinessRangeGroup(isAllDay);
+		if (eventRangeGroup) {
+			eventRanges = eventRangeGroup.eventRanges;
+		}
 	}
 	else if (typeof constraintVal === 'object') {
 		eventRanges = this.parseEventDefToEventRanges(constraintVal);

+ 11 - 4
src/common/Grid.events.js

@@ -142,6 +142,7 @@ Grid.mixin({
 	// FOR RENDERING
 	buildBusinessHourRanges: function(wholeDay, businessHours) {
 		var calendar = this.view.calendar;
+		var eventRangeGroup;
 
 		if (businessHours == null) {
 			// fallback
@@ -149,15 +150,21 @@ Grid.mixin({
 			businessHours = calendar.opt('businessHours');
 		}
 
-		return calendar.buildBusinessRangeGroup(
+		eventRangeGroup = calendar.buildBusinessRangeGroup(
 			wholeDay,
 			businessHours,
 			this.start,
 			this.end
-		).sliceRenderRanges(
-			new UnzonedRange(this.start, this.end),
-			calendar
 		);
+
+		if (eventRangeGroup) {
+			return eventRangeGroup.sliceRenderRanges(
+				new UnzonedRange(this.start, this.end),
+				calendar
+			);
+		}
+
+		return [];
 	},
 
 

+ 4 - 0
src/models/event/EventRangeGroup.js

@@ -1,4 +1,8 @@
 
+/*
+It's expected that there will be at least one EventRange,
+OR that an explicitEventDef is assigned.
+*/
 var EventRangeGroup = Class.extend({
 
 	eventRanges: null,