Bladeren bron

refactor event span/seg slicing methods to be more robust

Adam Shaw 10 jaren geleden
bovenliggende
commit
72dc3388cc
1 gewijzigde bestanden met toevoegingen van 42 en 27 verwijderingen
  1. 42 27
      src/common/Grid.events.js

+ 42 - 27
src/common/Grid.events.js

@@ -792,16 +792,21 @@ Grid.mixin({
 	},
 	},
 
 
 
 
-	// Generates a single span (always unzoned) by using the given event's dates.
+	eventToSpan: function(event) {
+		return this.eventToSpans(event)[0];
+	},
+
+
+	// Generates spans (always unzoned) for the given event.
 	// Does not do any inverting for inverse-background events.
 	// Does not do any inverting for inverse-background events.
 	// Can accept an event "location" as well (which only has start/end and no allDay)
 	// Can accept an event "location" as well (which only has start/end and no allDay)
-	eventToSpan: function(event) {
+	eventToSpans: function(event) {
 		var range = this.eventToRange(event);
 		var range = this.eventToRange(event);
-		this.transformEventSpan(range, event); // convert it to a span, in-place
-		return range;
+		return this.eventRangeToSpans(range, event);
 	},
 	},
 
 
 
 
+
 	// Converts an array of event objects into an array of event segment objects.
 	// Converts an array of event objects into an array of event segment objects.
 	// A custom `segSliceFunc` may be given for arbitrarily slicing up events.
 	// A custom `segSliceFunc` may be given for arbitrarily slicing up events.
 	// Doesn't guarantee an order for the resulting array.
 	// Doesn't guarantee an order for the resulting array.
@@ -823,13 +828,15 @@ Grid.mixin({
 				ranges = _this.invertRanges(ranges);
 				ranges = _this.invertRanges(ranges);
 
 
 				for (i = 0; i < ranges.length; i++) {
 				for (i = 0; i < ranges.length; i++) {
-					_this.generateEventSegs(ranges[i], events[0], segSliceFunc, segs);
+					segs.push.apply(segs, // append to
+						_this.eventRangeToSegs(ranges[i], events[0], segSliceFunc));
 				}
 				}
 			}
 			}
 			// normal event ranges
 			// normal event ranges
 			else {
 			else {
 				for (i = 0; i < ranges.length; i++) {
 				for (i = 0; i < ranges.length; i++) {
-					_this.generateEventSegs(ranges[i], events[i], segSliceFunc, segs);
+					segs.push.apply(segs, // append to
+						_this.eventRangeToSegs(ranges[i], events[i], segSliceFunc));
 				}
 				}
 			}
 			}
 		});
 		});
@@ -858,36 +865,43 @@ Grid.mixin({
 	},
 	},
 
 
 
 
-	// Given an event's span (unzoned start/end and other misc data), and the event itself,
-	// slice into segments (using the segSliceFunc function if specified) and append to the `out` array.
-	// SIDE EFFECT: will mutate the given `range`.
-	generateEventSegs: function(range, event, segSliceFunc, out) {
-		var segs;
+	// Given an event's range (unzoned start/end), and the event itself,
+	// slice into segments (using the segSliceFunc function if specified)
+	eventRangeToSegs: function(range, event, segSliceFunc) {
+		var spans = this.eventRangeToSpans(range, event);
+		var segs = [];
 		var i;
 		var i;
 
 
-		this.transformEventSpan(range, event); // converts the range to a span
-
-		segs = segSliceFunc ? segSliceFunc(range) : this.spanToSegs(range);
-
-		for (i = 0; i < segs.length; i++) {
-			this.transformEventSeg(segs[i], range, event);
-			out.push(segs[i]);
+		for (i = 0; i < spans.length; i++) {
+			segs.push.apply(segs, // append to
+				this.eventSpanToSegs(spans[i], event, segSliceFunc));
 		}
 		}
+
+		return segs;
 	},
 	},
 
 
 
 
-	// Given a range (unzoned start/end) that is about to become a span,
-	// attach any event-derived properties to it.
-	transformEventSpan: function(range, event) {
-		// subclasses can implement
+	// Given an event's unzoned date range, return an array of "span" objects.
+	// Subclasses can override.
+	eventRangeToSpans: function(range, event) {
+		return [ $.extend({}, range) ]; // copy into a single-item array
 	},
 	},
 
 
 
 
-	// Given a segment object, attach any extra properties, based off of its source span and event.
-	transformEventSeg: function(seg, span, event) {
-		seg.event = event;
-		seg.eventStartMS = +span.start; // TODO: not the best name after making spans unzoned
-		seg.eventDurationMS = span.end - span.start;
+	// Given an event's span (unzoned start/end and other misc data), and the event itself,
+	// slices into segments and attaches event-derived properties to them.
+	eventSpanToSegs: function(span, event, segSliceFunc) {
+		var segs = segSliceFunc ? segSliceFunc(span) : this.spanToSegs(span);
+		var i, seg;
+
+		for (i = 0; i < segs.length; i++) {
+			seg = segs[i];
+			seg.event = event;
+			seg.eventStartMS = +span.start; // TODO: not the best name after making spans unzoned
+			seg.eventDurationMS = span.end - span.start;
+		}
+
+		return segs;
 	},
 	},
 
 
 
 
@@ -954,6 +968,7 @@ function isBgEvent(event) { // returns true if background OR inverse-background
 	var rendering = getEventRendering(event);
 	var rendering = getEventRendering(event);
 	return rendering === 'background' || rendering === 'inverse-background';
 	return rendering === 'background' || rendering === 'inverse-background';
 }
 }
+FC.isBgEvent = isBgEvent; // export
 
 
 
 
 function isInverseBgEvent(event) {
 function isInverseBgEvent(event) {