Przeglądaj źródła

kill startendmixin, use eventdateprofile object

Adam Shaw 8 lat temu
rodzic
commit
ae1822b2ea

+ 0 - 1
src.json

@@ -50,7 +50,6 @@
     "models/ComponentFootprint.js",
     "models/EventManager.js",
     "models/EventPeriod.js",
-    "models/event/EventStartEndMixin.js",
     "models/event/EventDefParser.js",
     "models/event/EventDef.js",
     "models/event/SingleEventDef.js",

+ 1 - 1
src/Calendar.moment.js

@@ -156,7 +156,7 @@ Calendar.mixin({
 			}
 		}
 
-		return new EventDateProfile(start, end);
+		return new EventDateProfile(start, end, this);
 	},
 
 

+ 1 - 4
src/common/Grid.js

@@ -471,10 +471,7 @@ var Grid = FC.Grid = ChronoComponent.extend({
 		var dummyEvent = new SingleEventDef(new EventSource(calendar));
 		var dummyInstance;
 
-		// TODO: have SingleEventDef leverage EventDateProfile and kill EventStartEndMixin?
-		dummyEvent.start = eventDateProfile.start;
-		dummyEvent.end = eventDateProfile.end;
-
+		dummyEvent.dateProfile = eventDateProfile;
 		dummyInstance = dummyEvent.buildInstances()[0];
 
 		return new EventFootprint(componentFootprint, dummyEvent, dummyInstance);

+ 1 - 1
src/common/View.js

@@ -760,7 +760,7 @@ var View = FC.View = ChronoComponent.extend({
 	triggerExternalDrop: function(singleEventDef, isEvent, el, ev, ui) {
 
 		// trigger 'drop' regardless of whether element represents an event
-		this.publiclyTrigger('drop', el[0], singleEventDef.start, ev, ui);
+		this.publiclyTrigger('drop', el[0], singleEventDef.dateProfile.start, ev, ui);
 
 		if (isEvent) {
 			// signal an external event landed

+ 52 - 12
src/models/event/EventDateProfile.js

@@ -1,17 +1,30 @@
 
-var EventDateProfile = Class.extend(EventStartEndMixin, {
+/*
+Meant to be immutable
+*/
+var EventDateProfile = Class.extend({
+
+	start: null,
+	end: null,
+	unzonedRange: null,
 
 
-	constructor: function(start, end) {
+	constructor: function(start, end, calendar) {
 		this.start = start;
-		this.end = end;
+		this.end = end || null;
+		this.unzonedRange = this.buildUnzonedRange(calendar);
+	},
+
+
+	isAllDay: function() {
+		return !(this.start.hasTime() || (this.end && this.end.hasTime()));
 	},
 
 
 	/*
 	Needs a Calendar object
 	*/
-	buildRange: function(calendar) {
+	buildUnzonedRange: function(calendar) {
 		var startMs = this.start.clone().stripZone().valueOf();
 		var endMs = this.getEnd(calendar).stripZone().valueOf();
 
@@ -36,20 +49,44 @@ var EventDateProfile = Class.extend(EventStartEndMixin, {
 
 
 /*
-Needs a Calendar object
-TODO: this seems like repeat code :(
+Needs an EventSource object
 */
-EventDateProfile.parse = function(rawProps, calendar) {
-	var start = calendar.moment(rawProps.start);
-	var end = rawProps.end ? calendar.moment(rawProps.end) : null;
+EventDateProfile.parse = function(rawProps, source) {
+	var startInput = rawProps.start || rawProps.date;
+	var endInput = rawProps.end;
+
+	if (!startInput) {
+		return false;
+	}
+
+	var calendar = source.calendar;
+	var start = calendar.moment(startInput);
+	var end = endInput ? calendar.moment(endInput) : null;
+	var forcedAllDay = rawProps.allDay;
+	var forceEventDuration = calendar.opt('forceEventDuration');
 
-	if (rawProps.allDay === true) {
+	if (!start.isValid()) {
+		return false;
+	}
+
+	if (end && (!end.isValid() || !end.isAfter(start))) {
+		end = null;
+	}
+
+	if (forcedAllDay == null) {
+		forcedAllDay = source.allDayDefault;
+		if (forcedAllDay == null) {
+			forcedAllDay = calendar.opt('allDayDefault');
+		}
+	}
+
+	if (forcedAllDay === true) {
 		start.stripTime();
 		if (end) {
 			end.stripTime();
 		}
 	}
-	else if (rawProps.allDay === false) {
+	else if (forcedAllDay === false) {
 		if (!start.hasTime()) {
 			start.time(0);
 		}
@@ -58,6 +95,9 @@ EventDateProfile.parse = function(rawProps, calendar) {
 		}
 	}
 
+	if (!end && forceEventDuration) {
+		end = calendar.getDefaultEventEnd(!start.hasTime(), start);
+	}
 
-	return new EventDateProfile(start, end);
+	return new EventDateProfile(start, end, calendar);
 };

+ 6 - 17
src/models/event/EventDefDateMutation.js

@@ -10,20 +10,15 @@ var EventDefDateMutation = Class.extend({
 
 
 	/*
-	eventDef assumed to be a SingleEventDef.
 	returns an undo function.
 	*/
-	mutateSingle: function(eventDef) {
-
-		var calendar = eventDef.source.calendar;
-		var origStart = eventDef.start;
-		var origEnd = eventDef.end;
-		var start = origStart.clone();
+	buildNewDateProfile: function(eventDateProfile, calendar) {
+		var start = eventDateProfile.start.clone();
 		var end = null;
 		var shouldRezone = false;
 
-		if (!this.clearEnd && origEnd) {
-			end = origEnd.clone();
+		if (!this.clearEnd && eventDateProfile.end) {
+			end = eventDateProfile.end.clone();
 		}
 
 		if (this.forceTimed) {
@@ -63,7 +58,7 @@ var EventDefDateMutation = Class.extend({
 			shouldRezone = true;
 
 			if (!end) {
-				end = calendar.getDefaultEventEnd(eventDef.isAllDay(), start);
+				end = calendar.getDefaultEventEnd(eventDateProfile.isAllDay(), start);
 			}
 
 			end.add(this.endDelta);
@@ -88,13 +83,7 @@ var EventDefDateMutation = Class.extend({
 			end = calendar.getDefaultEventEnd(eventDef.isAllDay(), start);
 		}
 
-		eventDef.start = start;
-		eventDef.end = end;
-
-		return function() {
-			eventDef.start = origStart;
-			eventDef.end = origEnd;
-		};
+		return new EventDateProfile(start, end, calendar);
 	},
 
 

+ 24 - 13
src/models/event/EventDefMutation.js

@@ -14,10 +14,15 @@ var EventDefMutation = Class.extend({
 	returns an undo function.
 	*/
 	mutateSingle: function(eventDef) {
-		var undoDateMutation;
+		var origDateProfile;
 
 		if (this.dateMutation) {
-			undoDateMutation = this.dateMutation.mutateSingle(eventDef);
+			origDateProfile = eventDef.dateProfile;
+
+			eventDef.dateProfile = this.dateMutation.buildNewDateProfile(
+				origDateProfile,
+				eventDef.source.calendar
+			);
 		}
 
 		// can't undo
@@ -30,8 +35,10 @@ var EventDefMutation = Class.extend({
 			eventDef.miscProps = this.miscProps;
 		}
 
-		if (undoDateMutation) {
-			return undoDateMutation;
+		if (origDateProfile) {
+			return function() {
+				eventDef.dateProfile = origDateProfile;
+			};
 		}
 		else {
 			return function() { };
@@ -48,7 +55,6 @@ var EventDefMutation = Class.extend({
 
 EventDefMutation.createFromRawProps = function(eventInstance, newRawProps, largeUnit) {
 	var eventDef = eventInstance.def;
-	var calendar = eventDef.source.calendar;
 	var standardProps = {};
 	var miscProps = {};
 	var propName;
@@ -71,18 +77,23 @@ EventDefMutation.createFromRawProps = function(eventInstance, newRawProps, large
 		}
 	}
 
-	// the 'start' and 'end' props will be leveraged
-	newDateProfile = EventDateProfile.parse(newRawProps, calendar);
-	dateMutation = EventDefDateMutation.createFromDiff(
-		eventInstance.dateProfile,
-		newDateProfile,
-		largeUnit
-	);
+	newDateProfile = EventDateProfile.parse(newRawProps, eventDef.source);
+
+	if (newDateProfile) { // no failure?
+		dateMutation = EventDefDateMutation.createFromDiff(
+			eventInstance.dateProfile,
+			newDateProfile,
+			largeUnit
+		);
+	}
 
 	defMutation = new EventDefMutation();
 	defMutation.standardProps = standardProps;
 	defMutation.miscProps = miscProps;
-	defMutation.dateMutation = dateMutation;
+
+	if (dateMutation) {
+		defMutation.dateMutation = dateMutation;
+	}
 
 	return defMutation;
 };

+ 0 - 13
src/models/event/EventInstance.js

@@ -3,24 +3,11 @@ var EventInstance = Class.extend({
 
 	def: null, // EventDef
 	dateProfile: null, // EventDateProfile
-	dateRange: null, // UnzonedRange
 
 
 	constructor: function(def, dateProfile) {
 		this.def = def;
 		this.dateProfile = dateProfile;
-		this.dateRange = dateProfile.buildRange(
-			def.source.calendar
-		);
-	},
-
-
-	buildEventRange: function() { // EventRange
-		return new EventRange(
-			this.dateRange,
-			this.def,
-			this
-		);
 	},
 
 

+ 1 - 1
src/models/event/EventInstanceGroup.js

@@ -38,7 +38,7 @@ var EventInstanceGroup = Class.extend({
 		for (i = 0; i < eventInstances.length; i++) {
 			eventInstance = eventInstances[i];
 
-			slicedDateRange = eventInstance.dateRange.constrainTo(constraintRange);
+			slicedDateRange = eventInstance.dateProfile.unzonedRange.constrainTo(constraintRange);
 
 			if (slicedDateRange) {
 				slicedEventRanges.push(

+ 0 - 12
src/models/event/EventStartEndMixin.js

@@ -1,12 +0,0 @@
-
-var EventStartEndMixin = {
-
-	start: null,
-	end: null,
-
-
-	isAllDay: function() {
-		return !(this.start.hasTime() || (this.end && this.end.hasTime()));
-	}
-
-};

+ 2 - 1
src/models/event/RecurringEventDef.js

@@ -12,6 +12,7 @@ var RecurringEventDef = EventDef.extend({
 
 
 	buildInstances: function(start, end) {
+		var calendar = this.source.calendar;
 		var date = start.clone();
 		var instanceStart, instanceEnd;
 		var instances = [];
@@ -38,7 +39,7 @@ var RecurringEventDef = EventDef.extend({
 				instances.push(
 					new EventInstance(
 						this, // definition
-						new EventDateProfile(instanceStart, instanceEnd)
+						new EventDateProfile(instanceStart, instanceEnd, calendar)
 					)
 				);
 			}

+ 20 - 58
src/models/event/SingleEventDef.js

@@ -1,5 +1,7 @@
 
-var SingleEventDef = EventDef.extend(EventStartEndMixin, {
+var SingleEventDef = EventDef.extend({
+
+	dateProfile: null,
 
 
 	/*
@@ -9,20 +11,21 @@ var SingleEventDef = EventDef.extend(EventStartEndMixin, {
 		return [
 			new EventInstance(
 				this, // definition
-				new EventDateProfile(this.start, this.end)
+				this.dateProfile
 			)
 		];
 	},
 
 
+	isAllDay: function() {
+		return this.dateProfile.isAllDay();
+	},
+
+
 	clone: function() {
 		var def = EventDef.prototype.clone.call(this);
 
-		def.start = this.start.clone();
-
-		if (this.end) {
-			def.end = this.end.clone();
-		}
+		def.dateProfile = this.dateProfile;
 
 		return def;
 	},
@@ -30,12 +33,13 @@ var SingleEventDef = EventDef.extend(EventStartEndMixin, {
 
 	rezone: function() {
 		var calendar = this.source.calendar;
+		var dateProfile = this.dateProfile;
 
-		this.start = calendar.moment(this.start);
-
-		if (this.end) {
-			this.end = calendar.moment(this.end);
-		}
+		this.dateProfile = new EventDateProfile(
+			calendar.moment(dateProfile.start),
+			dateProfile.end ? calendar.moment(dateProfile.end) : null,
+			calendar
+		);
 	}
 
 });
@@ -51,54 +55,12 @@ SingleEventDef.defineStandardPropHandler([
 	'end',
 	'allDay'
 ], function(rawProps) {
-	var startInput = rawProps.start || rawProps.date;
-	var endInput = rawProps.end;
+	var dateProfile = EventDateProfile.parse(rawProps, this.source);
 
-	if (!startInput) {
-		return false;
+	if (dateProfile) { // no failure?
+		this.dateProfile = dateProfile;
 	}
-
-	var source = this.source;
-	var calendar = source.calendar;
-	var start = calendar.moment(startInput);
-	var end = endInput ? calendar.moment(endInput) : null;
-	var forcedAllDay = rawProps.allDay;
-	var forceEventDuration = calendar.opt('forceEventDuration');
-
-	if (!start.isValid()) {
+	else {
 		return false;
 	}
-
-	if (end && (!end.isValid() || !end.isAfter(start))) {
-		end = null;
-	}
-
-	if (forcedAllDay == null) {
-		forcedAllDay = source.allDayDefault;
-		if (forcedAllDay == null) {
-			forcedAllDay = calendar.opt('allDayDefault');
-		}
-	}
-
-	if (forcedAllDay === true) {
-		start.stripTime();
-		if (end) {
-			end.stripTime();
-		}
-	}
-	else if (forcedAllDay === false) {
-		if (!start.hasTime()) {
-			start.time(0);
-		}
-		if (end && !end.hasTime()) {
-			end.time(0);
-		}
-	}
-
-	if (!end && forceEventDuration) {
-		end = calendar.getDefaultEventEnd(!start.hasTime(), start);
-	}
-
-	this.start = start;
-	this.end = end;
 });

+ 7 - 3
src/models/event/util.js

@@ -14,15 +14,19 @@ function eventDefsToEventInstances(eventDefs, start, end) {
 
 
 function eventInstancesToEventRanges(eventInstances) {
-	return eventInstances.map(function(instance) {
-		return instance.buildEventRange();
+	return eventInstances.map(function(eventInstance) {
+		return new EventRange(
+			eventInstance.dateProfile.unzonedRange,
+			eventInstance.def,
+			eventInstance
+		);
 	});
 }
 
 
 function eventInstancesToDateRanges(eventInstances) {
 	return eventInstances.map(function(eventInstance) {
-		return eventInstance.dateRange;
+		return eventInstance.dateProfile.unzonedRange;
 	});
 }