Kaynağa Gözat

protect dayClick/selection from dead dates

Adam Shaw 9 yıl önce
ebeveyn
işleme
70ca59a45e
2 değiştirilmiş dosya ile 45 ekleme ve 23 silme
  1. 14 14
      src/common/Grid.events.js
  2. 31 9
      src/common/Grid.js

+ 14 - 14
src/common/Grid.events.js

@@ -415,18 +415,20 @@ Grid.mixin({
 			},
 			hitOver: function(hit, isOrig, origHit) {
 				var isAllowed = true;
-				var hitSpan = hit.component.getHitSpan(hit); // hit might not belong to this grid
 				var origHitSpan;
+				var hitSpan;
 				var dragHelperEls;
 
-				if (view.isRangeInContentRange(hitSpan)) {
+				// starting hit could be forced (DayGrid.limit)
+				if (seg.hit) {
+					origHit = seg.hit;
+				}
 
-					// starting hit could be forced (DayGrid.limit)
-					if (seg.hit) {
-						origHit = seg.hit;
-					}
+				// hit might not belong to this grid, so query origin grid
+				origHitSpan = origHit.component.getSafeHitSpan(origHit);
+				hitSpan = hit.component.getSafeHitSpan(hit);
 
-					origHitSpan = origHit.component.getHitSpan(origHit); // hit might not belong to this grid
+				if (origHitSpan && hitSpan) {
 					dropLocation = _this.computeEventDrop(origHitSpan, hitSpan, event);
 					isAllowed = dropLocation && _this.isEventLocationAllowed(dropLocation, event);
 				}
@@ -630,9 +632,9 @@ Grid.mixin({
 			},
 			hitOver: function(hit) {
 				var isAllowed = true;
-				var hitSpan = hit.component.getHitSpan(hit); // hit might not belong to this grid
+				var hitSpan = hit.component.getSafeHitSpan(hit); // hit might not belong to this grid
 
-				if (view.isRangeInContentRange(hitSpan)) {
+				if (hitSpan) {
 					dropLocation = _this.computeExternalDrop(hitSpan, meta);
 					isAllowed = dropLocation && this.isExternalLocationAllowed(dropLocation, meta.eventProps);
 				}
@@ -744,12 +746,10 @@ Grid.mixin({
 			},
 			hitOver: function(hit, isOrig, origHit) {
 				var isAllowed = true;
-				var hitSpan = _this.getHitSpan(hit);
-				var origHitSpan;
-
-				if (view.isRangeInContentRange(hitSpan)) {
-					origHitSpan = _this.getHitSpan(origHit);
+				var origHitSpan = _this.getSafeHitSpan(origHit);
+				var hitSpan = _this.getSafeHitSpan(hit);
 
+				if (origHitSpan && hitSpan) {
 					resizeLocation = isStart ?
 						_this.computeEventStartResize(origHitSpan, hitSpan, event) :
 						_this.computeEventEndResize(origHitSpan, hitSpan, event);

+ 31 - 9
src/common/Grid.js

@@ -169,6 +169,18 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, {
 	},
 
 
+	// like getHitSpan, but returns null if the resulting span's range is invalid
+	getSafeHitSpan: function(hit) {
+		var hitSpan = this.getHitSpan(hit);
+
+		if (!this.view.isRangeInContentRange(hitSpan)) {
+			return null;
+		}
+
+		return hitSpan;
+	},
+
+
 	// Given position-level information about a date-related area within the grid,
 	// should return an object with at least a start/end date. Can provide other information as well.
 	getHitSpan: function(hit) {
@@ -341,12 +353,14 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, {
 				dayClickHit = null;
 			},
 			interactionEnd: function(ev, isCancelled) {
+				var hitSpan;
+
 				if (!isCancelled && dayClickHit) {
-					view.triggerDayClick(
-						_this.getHitSpan(dayClickHit),
-						_this.getHitEl(dayClickHit),
-						ev
-					);
+					hitSpan = _this.getSafeHitSpan(dayClickHit);
+
+					if (hitSpan) {
+						view.triggerDayClick(hitSpan, _this.getHitEl(dayClickHit), ev);
+					}
 				}
 			}
 		});
@@ -376,12 +390,20 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, {
 				view.unselect(); // since we could be rendering a new selection, we want to clear any old one
 			},
 			hitOver: function(hit, isOrig, origHit) {
+				var origHitSpan;
+				var hitSpan;
+
 				if (origHit) { // click needs to have started on a hit
 
-					selectionSpan = _this.computeSelection(
-						_this.getHitSpan(origHit),
-						_this.getHitSpan(hit)
-					);
+					origHitSpan = _this.getSafeHitSpan(origHit);
+					hitSpan = _this.getSafeHitSpan(hit);
+
+					if (origHitSpan && hitSpan) {
+						selectionSpan = _this.computeSelection(origHitSpan, hitSpan);
+					}
+					else {
+						selectionSpan = null;
+					}
 
 					if (selectionSpan) {
 						_this.renderSelection(selectionSpan);