Jelajahi Sumber

fix bug with faulty businessHours rendering when changing dates

Adam Shaw 11 tahun lalu
induk
melakukan
d5ac33442c
3 mengubah file dengan 42 tambahan dan 13 penghapusan
  1. 11 12
      src/EventManager.js
  2. 1 1
      src/common/TimeGrid.js
  3. 30 0
      tests/automated/businessHours.js

+ 11 - 12
src/EventManager.js

@@ -598,11 +598,10 @@ function EventManager(options) { // assumed to be a calendar
 	// If the given event is a recurring event, break it down into an array of individual instances.
 	// If not a recurring event, return an array with the single original event.
 	// If given a falsy input (probably because of a failed buildEventFromInput call), returns an empty array.
-	function expandEvent(abstractEvent) {
+	// HACK: can override the recurring window by providing custom rangeStart/rangeEnd (for businessHours).
+	function expandEvent(abstractEvent, _rangeStart, _rangeEnd) {
 		var events = [];
 		var view;
-		var _rangeStart = rangeStart;
-		var _rangeEnd = rangeEnd;
 		var dowHash;
 		var dow;
 		var i;
@@ -611,12 +610,8 @@ function EventManager(options) { // assumed to be a calendar
 		var start, end;
 		var event;
 
-		// hack for when fetchEvents hasn't been called yet (calculating businessHours for example)
-		if (!_rangeStart || !_rangeEnd) {
-			view = t.getView();
-			_rangeStart = view.start;
-			_rangeEnd = view.end;
-		}
+		_rangeStart = _rangeStart || rangeStart;
+		_rangeEnd = _rangeEnd || rangeEnd;
 
 		if (abstractEvent) {
 			if (abstractEvent._recurring) {
@@ -848,9 +843,9 @@ function EventManager(options) { // assumed to be a calendar
 	t.getBusinessHoursEvents = getBusinessHoursEvents;
 
 
-	// Returns an array of events as to when the business hours occur in the current view.
+	// Returns an array of events as to when the business hours occur in the given view.
 	// Abuse of our event system :(
-	function getBusinessHoursEvents() {
+	function getBusinessHoursEvents(view) {
 		var optionVal = options.businessHours;
 		var defaultVal = {
 			className: 'fc-nonbusiness',
@@ -873,7 +868,11 @@ function EventManager(options) { // assumed to be a calendar
 		}
 
 		if (eventInput) {
-			return expandEvent(buildEventFromInput(eventInput));
+			return expandEvent(
+				buildEventFromInput(eventInput),
+				view.start,
+				view.end
+			);
 		}
 
 		return [];

+ 1 - 1
src/common/TimeGrid.js

@@ -45,7 +45,7 @@ $.extend(TimeGrid.prototype, {
 
 
 	renderBusinessHours: function() {
-		var events = this.view.calendar.getBusinessHoursEvents();
+		var events = this.view.calendar.getBusinessHoursEvents(this.view);
 		this.businessHourSegs = this.renderFill('businessHours', this.eventsToSegs(events), 'bgevent');
 	},
 

+ 30 - 0
tests/automated/businessHours.js

@@ -0,0 +1,30 @@
+// most other businessHours tests are in background-events.js
+
+describe('businessHours', function() {
+	var options;
+
+	beforeEach(function() {
+		options = {
+			defaultDate: '2014-11-25',
+			defaultView: 'month',
+			businessHours: true
+		};
+		affix('#cal');
+	});
+
+	it('doesn\'t break when starting out in a larger month time range', function() {
+		$('#cal').fullCalendar(options); // start out in the month range
+		$('#cal').fullCalendar('changeView', 'agendaWeek');
+		$('#cal').fullCalendar('next'); // move out of the original month range...
+		$('#cal').fullCalendar('next'); // ... out. should render correctly.
+
+		expect($('.fc-nonbusiness').length).toBe(12);
+		expect($('.fc-bgevent-skeleton td:not(.fc-axis):eq(0) .fc-nonbusiness').length).toBe(1); // column 0
+		expect($('.fc-bgevent-skeleton td:not(.fc-axis):eq(1) .fc-nonbusiness').length).toBe(2); // column 1
+		expect($('.fc-bgevent-skeleton td:not(.fc-axis):eq(2) .fc-nonbusiness').length).toBe(2); // column 2
+		expect($('.fc-bgevent-skeleton td:not(.fc-axis):eq(3) .fc-nonbusiness').length).toBe(2); // column 3
+		expect($('.fc-bgevent-skeleton td:not(.fc-axis):eq(4) .fc-nonbusiness').length).toBe(2); // column 4
+		expect($('.fc-bgevent-skeleton td:not(.fc-axis):eq(5) .fc-nonbusiness').length).toBe(2); // column 5
+		expect($('.fc-bgevent-skeleton td:not(.fc-axis):eq(6) .fc-nonbusiness').length).toBe(1); // column 6
+	});
+});