Adam Shaw 9 лет назад
Родитель
Сommit
8da9b7f362

+ 20 - 3
src/Calendar.js

@@ -321,7 +321,23 @@ var Calendar = FC.Calendar = Class.extend({
 	// for external API
 	getDate: function() {
 		return this.applyTimezone(this.currentDate); // infuse the calendar's timezone
-	}
+	},
+
+
+	/*parseRange: function(rangeInput) {
+		var start = null;
+		var end = null;
+
+		if (rangeInput.start) {
+			start = this.moment(rangeInput.start);
+		}
+
+		if (rangeInput.end) {
+			end = this.moment(rangeInput.end);
+		}
+
+		return { start: start, end: end };
+	}*/
 
 });
 
@@ -836,7 +852,7 @@ function Calendar_constructor(element, overrides) {
 		if (
 			!ignoreWindowResize &&
 			ev.target === window && // so we don't process jqui "resize" events that have bubbled up
-			currentView.renderStart // view has already been rendered
+			currentView.renderRange // view has already been rendered
 		) {
 			if (updateSize(true)) {
 				currentView.publiclyTrigger('windowResize', _element);
@@ -913,7 +929,8 @@ function Calendar_constructor(element, overrides) {
 
 	t.updateToolbarButtons = function() {
 		var now = t.getNow();
-		if (now >= currentView.intervalStart && now < currentView.intervalEnd) {
+
+		if (isDateWithinRange(now, currentView.intervalRange)) {
 			toolbarsManager.proxyCall('disableButton', 'today');
 		}
 		else {

+ 2 - 2
src/EventManager.js

@@ -1401,8 +1401,8 @@ Calendar.prototype.expandBusinessHourEvents = function(wholeDay, inputs, ignoreN
 		events.push.apply(events, // append
 			this.expandEvent(
 				this.buildEventFromInput(input),
-				view.contentStart,
-				view.contentEnd
+				view.contentRange.start,
+				view.contentRange.end
 			)
 		);
 	}

+ 2 - 8
src/agenda/AgendaView.js

@@ -60,16 +60,10 @@ var AgendaView = FC.AgendaView = View.extend({
 	// Renders the view into `this.el`, which has already been assigned
 	renderDates: function() {
 
-		this.timeGrid.setRange({
-			start: this.renderStart,
-			end: this.renderEnd
-		});
+		this.timeGrid.setRange(this.renderRange);
 
 		if (this.dayGrid) {
-			this.dayGrid.setRange({
-				start: this.renderStart,
-				end: this.renderEnd
-			});
+			this.dayGrid.setRange(this.renderRange);
 		}
 
 		this.el.addClass('fc-agenda-view').html(this.renderSkeletonHtml());

+ 1 - 4
src/basic/BasicView.js

@@ -65,10 +65,7 @@ var BasicView = FC.BasicView = View.extend({
 	renderDates: function() {
 
 		this.dayGrid.breakOnWeeks = /year|month|week/.test(this.intervalUnit); // do before Grid::setRange
-		this.dayGrid.setRange({
-			start: this.renderStart,
-			end: this.renderEnd
-		});
+		this.dayGrid.setRange(this.renderRange);
 
 		this.dayNumbersVisible = this.dayGrid.rowCnt > 1; // TODO: make grid responsible
 		if (this.opt('weekNumbers')) {

+ 5 - 8
src/common/Grid.events.js

@@ -218,8 +218,8 @@ Grid.mixin({
 		if (!events.length && businessHours) {
 			events = [
 				$.extend({}, BUSINESS_HOUR_EVENT_DEFAULTS, {
-					start: this.view.contentEnd, // guaranteed out-of-range
-					end: this.view.contentEnd,   // "
+					start: this.view.contentRange.end, // guaranteed out-of-range
+					end: this.view.contentRange.end,   // "
 					dow: null
 				})
 			];
@@ -1161,10 +1161,7 @@ Grid.mixin({
 	refineRawEventRange: function(rawRange) {
 		var view = this.view;
 		var calendar = view.calendar;
-		var range = intersectRanges(rawRange, {
-			start: view.contentStart,
-			end: view.contentEnd
-		});
+		var range = intersectRanges(rawRange, view.contentRange);
 
 		if (range) { // otherwise, event doesn't have valid range
 
@@ -1256,8 +1253,8 @@ Grid.mixin({
 	// SIDE EFFECT: will mutate the given array and will use its date references.
 	invertRanges: function(ranges) {
 		var view = this.view;
-		var viewStart = view.contentStart.clone(); // need a copy
-		var viewEnd = view.contentEnd.clone(); // need a copy
+		var viewStart = view.contentRange.start.clone(); // need a copy
+		var viewEnd = view.contentRange.end.clone(); // need a copy
 		var inverseRanges = [];
 		var start = viewStart; // the end of the previous range. the start of the new range
 		var i, range;

+ 1 - 1
src/common/Grid.js

@@ -703,7 +703,7 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, {
 
 			if (
 				view.intervalDuration.as('months') == 1 &&
-				date.month() != view.intervalStart.month()
+				date.month() != view.intervalRange.start.month()
 			) {
 				classes.push('fc-other-month');
 			}

+ 29 - 55
src/common/View.js

@@ -23,30 +23,26 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
 
 	// range the view is formally responsible for (moments)
 	// may be different from start/end. for example, a month view might have 1st-31st, excluding padded dates
-	intervalStart: null,
-	intervalEnd: null, // exclusive
+	intervalRange: null, // TODO: rename to "currentRange"
 	intervalDuration: null,
 	intervalUnit: null, // name of largest unit being displayed, like "month" or "week"
 
 	// date range with a rendered skeleton
 	// includes not-active days that need some sort of DOM
-	renderStart: null,
-	renderEnd: null,
+	renderRange: null,
 
 	// active dates that display events and accept drag-nd-drop
-	contentStart: null,
-	contentEnd: null,
+	contentRange: null, // TODO: rename to "visibleRange"
 
-	// DEPRECATED: use contentStart/contentEnd instead
+	// DEPRECATED: use contentRange instead
 	start: null,
 	end: null,
 
 	// date constraints. defines the "valid range"
 	// TODO: enforce this in prev/next/gotoDate
-	minDate: null,
-	maxDate: null,
+	validRange: null,
 
-	// for dates that are outside of minDate/maxDate
+	// for dates that are outside of validRange
 	// true = not rendered at all
 	// false = rendered, but disabled
 	isOutOfRangeHidden: false,
@@ -157,35 +153,30 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
 		// best place for this?
 		var minDateInput = this.opt('minDate');
 		var maxDateInput = this.opt('maxDate');
+		var validRange = {};
 		if (minDateInput) {
-			this.minDate = this.calendar.moment(minDateInput);
+			validRange.start = this.calendar.moment(minDateInput).stripZone();
 		}
 		if (maxDateInput) {
-			this.maxDate = this.calendar.moment(maxDateInput);
+			validRange.end = this.calendar.moment(maxDateInput).stripZone();
 		}
+		this.validRange = validRange;
 
 		var intervalRange = this.computeIntervalRange(date);
 		var renderRange = this.computeRenderRange(intervalRange);
 		var contentRange = this.computeContentRange(renderRange, intervalRange);
 
-		if (
-			!this.contentStart ||
-			!this.contentStart.isSame(contentRange.start) ||
-			!this.contentEnd.isSame(contentRange.end)
-		) {
+		if (!this.contentRange || !isRangesEqual(this.contentRange, contentRange)) {
 			// some sort of change
 
-			this.intervalStart = intervalRange.start;
-			this.intervalEnd = intervalRange.end;
-			this.renderStart = renderRange.start;
-			this.renderEnd = renderRange.end;
-			this.contentStart = contentRange.start;
-			this.contentEnd = contentRange.end;
+			this.intervalRange = intervalRange;
+			this.renderRange = renderRange;
+			this.contentRange = contentRange;
 
 			// DEPRECATED, but we need to keep it updated
 			// TODO: run automated tests with this commented out
-			this.start = this.contentStart;
-			this.end = this.contentEnd;
+			this.start = contentRange.start;
+			this.end = contentRange.end;
 
 			this.updateTitle();
 			this.calendar.updateToolbarButtons();
@@ -231,7 +222,7 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
 		renderRange = this.trimHiddenDays(renderRange);
 
 		if (this.isOutOfRangeHidden) {
-			renderRange = this.trimToValidRange(renderRange);
+			renderRange = constrainRange(renderRange, this.validRange);
 		}
 
 		return renderRange;
@@ -249,39 +240,24 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
 
 		// probably already done in sanitizeRenderRange,
 		// but do again in case subclass added special behavior to computeRenderRange
-		contentRange = this.trimToValidRange(contentRange);
+		contentRange = constrainRange(contentRange, this.validRange);
 
 		return contentRange;
 	},
 
 
-	trimToValidRange: function(inputRange) {
-		var range = cloneRange(inputRange);
-
-		if (this.minDate) {
-			range.start = maxMoment(range.start, this.minDate);
-		}
-		if (this.maxDate) {
-			range.end = minMoment(range.end, this.maxDate);
-		}
-
-		return range;
-	},
-
-
 	isRangeInValidRange: function(range) {
-		return (!this.minDate || range.start >= this.minDate) &&
-			(!this.maxDate || range.end <= this.maxDate);
+		return isRangeWithinRange(range, this.validRange);
 	},
 
 
 	isDateInContentRange: function(date) {
-		return date >= this.contentStart && date < this.contentEnd;
+		return isDateWithinRange(date, this.contentRange);
 	},
 
 
 	isRangeInContentRange: function(range) {
-		return range.start >= this.contentStart && range.end <= this.contentEnd;
+		return isRangeWithinRange(range, this.contentRange);
 	},
 
 
@@ -337,23 +313,21 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
 
 	// Computes what the title at the top of the calendar should be for this view
 	computeTitle: function() {
-		var start, end;
+		var range;
 
 		// for views that span a large unit of time, show the proper interval, ignoring stray days before and after
 		if (/^(year|month)$/.test(this.intervalUnit)) {
-			start = this.intervalStart;
-			end = this.intervalEnd;
+			range = this.intervalRange;
 		}
 		else { // for day units or smaller, use the actual day range
-			start = this.contentStart;
-			end = this.contentEnd;
+			range = this.contentRange;
 		}
 
 		return this.formatRange(
 			{
-				// in case intervalStart/End has a time, make sure timezone is correct
-				start: this.calendar.applyTimezone(start),
-				end: this.calendar.applyTimezone(end)
+				// in case intervalRange has a time, make sure timezone is correct
+				start: this.calendar.applyTimezone(range.start),
+				end: this.calendar.applyTimezone(range.end)
 			},
 			this.opt('titleFormat') || this.computeTitleFormat(),
 			this.opt('titleRangeSeparator')
@@ -1156,7 +1130,7 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
 
 
 	requestEvents: function() {
-		return this.calendar.requestEvents(this.contentStart, this.contentEnd);
+		return this.calendar.requestEvents(this.contentRange.start, this.contentRange.end);
 	},
 
 
@@ -1568,7 +1542,7 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
 
 
 	// Incrementing the current day until it is no longer a hidden day, returning a copy.
-	// DOES NOT CONSIDER minDate/maxDate RANGE!
+	// DOES NOT CONSIDER validRange!
 	// If the initial value of `date` is not a hidden day, don't do anything.
 	// Pass `isExclusive` as `true` if you are dealing with an end date.
 	// `inc` defaults to `1` (increment one day forward each time)

+ 4 - 7
src/list/ListView.js

@@ -41,10 +41,7 @@ var ListView = View.extend({
 	},
 
 	renderDates: function() {
-		this.grid.setRange({ // needs to process range-related options
-			start: this.renderStart,
-			end: this.renderEnd
-		});
+		this.grid.setRange(this.renderRange); // needs to process range-related options
 	},
 
 	renderEvents: function(events) {
@@ -77,12 +74,12 @@ var ListViewGrid = Grid.extend({
 	// slices by day
 	spanToSegs: function(span) {
 		var view = this.view;
-		var dayStart = view.renderStart.clone().time(0); // timed, so segs get times!
+		var dayStart = view.renderRange.start.clone().time(0); // timed, so segs get times!
 		var dayIndex = 0;
 		var seg;
 		var segs = [];
 
-		while (dayStart < view.renderEnd) {
+		while (dayStart < view.renderRange.end) {
 
 			seg = intersectRanges(span, {
 				start: dayStart,
@@ -174,7 +171,7 @@ var ListViewGrid = Grid.extend({
 
 				// append a day header
 				tbodyEl.append(this.dayHeaderHtml(
-					this.view.renderStart.clone().add(dayIndex, 'days')
+					this.view.renderRange.start.clone().add(dayIndex, 'days')
 				));
 
 				this.sortEventSegs(daySegs);