Răsfoiți Sursa

make event dnd/resize use eventDef/eventInstance

Adam Shaw 8 ani în urmă
părinte
comite
ad0bcc07ee
2 a modificat fișierele cu 107 adăugiri și 37 ștergeri
  1. 66 25
      src/common/Grid.events.js
  2. 41 12
      src/common/View.js

+ 66 - 25
src/common/Grid.events.js

@@ -205,7 +205,13 @@ Grid.mixin({
 
 
 	handleSegClick: function(seg, ev) {
-		var res = this.view.publiclyTrigger('eventClick', seg.el[0], seg.event, ev); // can return `false` to cancel
+		var res = this.view.publiclyTrigger( // can return `false` to cancel
+			'eventClick',
+			seg.el[0],
+			seg.footprint.getEventLegacy(),
+			ev
+		);
+
 		if (res === false) {
 			ev.preventDefault();
 		}
@@ -219,10 +225,17 @@ Grid.mixin({
 			!this.mousedOverSeg
 		) {
 			this.mousedOverSeg = seg;
+
 			if (this.view.isEventDefResizable(seg.footprint.eventDef)) {
 				seg.el.addClass('fc-allow-mouse-resize');
 			}
-			this.view.publiclyTrigger('eventMouseover', seg.el[0], seg.event, ev);
+
+			this.view.publiclyTrigger(
+				'eventMouseover',
+				seg.el[0],
+				seg.footprint.getEventLegacy(),
+				ev
+			);
 		}
 	},
 
@@ -235,10 +248,17 @@ Grid.mixin({
 		if (this.mousedOverSeg) {
 			seg = seg || this.mousedOverSeg; // if given no args, use the currently moused-over segment
 			this.mousedOverSeg = null;
+
 			if (this.view.isEventDefResizable(seg.footprint.eventDef)) {
 				seg.el.removeClass('fc-allow-mouse-resize');
 			}
-			this.view.publiclyTrigger('eventMouseout', seg.el[0], seg.event, ev);
+
+			this.view.publiclyTrigger(
+				'eventMouseout',
+				seg.el[0],
+				seg.footprint.getEventLegacy(),
+				ev
+			);
 		}
 	},
 
@@ -257,7 +277,6 @@ Grid.mixin({
 
 	handleSegTouchStart: function(seg, ev) {
 		var view = this.view;
-		var event = seg.event;
 		var eventDef = seg.footprint.eventDef;
 		var isSelected = view.isEventDefSelected(eventDef);
 		var isDraggable = view.isEventDefDraggable(eventDef);
@@ -316,7 +335,6 @@ Grid.mixin({
 		var calendar = view.calendar;
 		var eventManager = calendar.eventManager;
 		var el = seg.el;
-		var event = seg.event; // is a legacy event
 		var eventDef = seg.footprint.eventDef;
 		var eventInstance = seg.footprint.eventInstance; // null for inverse-background events
 		var isDragging;
@@ -377,11 +395,11 @@ Grid.mixin({
 				footprint = hit.component.getSafeHitFootprint(hit);
 
 				if (origFootprint && footprint) {
-					eventDefMutation = _this.computeEventDropMutation(origFootprint, footprint, event);
+					eventDefMutation = _this.computeEventDropMutation(origFootprint, footprint, eventDef);
 
 					if (eventDefMutation) {
 						mutatedEventInstanceGroup = eventManager.buildMutatedEventInstanceGroup(
-							eventManager.getEventDefByUid(event._id).id,
+							eventDef.id,
 							eventDefMutation
 						);
 						isAllowed = _this.isEventInstanceGroupAllowed(mutatedEventInstanceGroup);
@@ -445,7 +463,7 @@ Grid.mixin({
 
 					if (eventDefMutation) {
 						// no need to re-show original, will rerender all anyways. esp important if eventRenderWait
-						view.reportEventDrop(event, eventDefMutation, el, ev);
+						view.reportEventDrop(eventInstance, eventDefMutation, el, ev);
 					}
 					else {
 						view.showEventsWithId(eventDef.id);
@@ -465,7 +483,6 @@ Grid.mixin({
 	buildSegSelectListener: function(seg) {
 		var _this = this;
 		var view = this.view;
-		var event = seg.event;
 		var eventDef = seg.footprint.eventDef;
 		var eventInstance = seg.footprint.eventInstance; // null for inverse-background events
 
@@ -496,19 +513,31 @@ Grid.mixin({
 	// Called before event segment dragging starts
 	segDragStart: function(seg, ev) {
 		this.isDraggingSeg = true;
-		this.view.publiclyTrigger('eventDragStart', seg.el[0], seg.event, ev, {}); // last argument is jqui dummy
+		this.view.publiclyTrigger(
+			'eventDragStart',
+			seg.el[0],
+			seg.footprint.getEventLegacy(),
+			ev,
+			{} // jqui dummy
+		);
 	},
 
 
 	// Called after event segment dragging stops
 	segDragStop: function(seg, ev) {
 		this.isDraggingSeg = false;
-		this.view.publiclyTrigger('eventDragStop', seg.el[0], seg.event, ev, {}); // last argument is jqui dummy
+		this.view.publiclyTrigger(
+			'eventDragStop',
+			seg.el[0],
+			seg.footprint.getEventLegacy(),
+			ev,
+			{} // jqui dummy
+		);
 	},
 
 
 	// DOES NOT consider overlap/constraint
-	computeEventDropMutation: function(startFootprint, endFootprint, legacyEvent) {
+	computeEventDropMutation: function(startFootprint, endFootprint, eventDef) {
 		var date0 = startFootprint.unzonedRange.getStart();
 		var date1 = endFootprint.unzonedRange.getStart();
 		var clearEnd = false;
@@ -710,8 +739,8 @@ Grid.mixin({
 		var calendar = view.calendar;
 		var eventManager = calendar.eventManager;
 		var el = seg.el;
-		var event = seg.event; // legacy event
 		var eventDef = seg.footprint.eventDef;
+		var eventInstance = seg.footprint.eventInstance;
 		var isDragging;
 		var resizeMutation; // zoned event date properties. falsy if invalid resize
 
@@ -735,12 +764,12 @@ Grid.mixin({
 
 				if (origHitFootprint && hitFootprint) {
 					resizeMutation = isStart ?
-						_this.computeEventStartResizeMutation(origHitFootprint, hitFootprint, event) :
-						_this.computeEventEndResizeMutation(origHitFootprint, hitFootprint, event);
+						_this.computeEventStartResizeMutation(origHitFootprint, hitFootprint, seg.footprint) :
+						_this.computeEventEndResizeMutation(origHitFootprint, hitFootprint, seg.footprint);
 
 					if (resizeMutation) {
 						mutatedEventInstanceGroup = eventManager.buildMutatedEventInstanceGroup(
-							eventManager.getEventDefByUid(event._id).id,
+							eventDef.id,
 							resizeMutation
 						);
 						isAllowed = _this.isEventInstanceGroupAllowed(mutatedEventInstanceGroup);
@@ -788,7 +817,7 @@ Grid.mixin({
 
 				if (resizeMutation) { // valid date to resize to?
 					// no need to re-show original, will rerender all anyways. esp important if eventRenderWait
-					view.reportEventResize(event, resizeMutation, el, ev);
+					view.reportEventResize(eventInstance, resizeMutation, el, ev);
 				}
 				else {
 					view.showEventsWithId(eventDef.id);
@@ -804,28 +833,40 @@ Grid.mixin({
 	// Called before event segment resizing starts
 	segResizeStart: function(seg, ev) {
 		this.isResizingSeg = true;
-		this.view.publiclyTrigger('eventResizeStart', seg.el[0], seg.event, ev, {}); // last argument is jqui dummy
+		this.view.publiclyTrigger(
+			'eventResizeStart',
+			seg.el[0],
+			seg.footprint.getEventLegacy(),
+			ev,
+			{} // jqui dummy
+		);
 	},
 
 
 	// Called after event segment resizing stops
 	segResizeStop: function(seg, ev) {
 		this.isResizingSeg = false;
-		this.view.publiclyTrigger('eventResizeStop', seg.el[0], seg.event, ev, {}); // last argument is jqui dummy
+		this.view.publiclyTrigger(
+			'eventResizeStop',
+			seg.el[0],
+			seg.footprint.getEventLegacy(),
+			ev,
+			{} // jqui dummy
+		);
 	},
 
 
 	// Returns new date-information for an event segment being resized from its start
-	computeEventStartResizeMutation: function(startFootprint, endFootprint, event) {
+	computeEventStartResizeMutation: function(startFootprint, endFootprint, origEventFootprint) {
+		var origRange = origEventFootprint.componentFootprint.unzonedRange;
 		var startDelta = this.diffDates(
 			endFootprint.unzonedRange.getStart(),
 			startFootprint.unzonedRange.getStart()
 		);
-		var eventEnd = this.view.calendar.getEventEnd(event);
 		var dateMutation;
 		var eventDefMutation;
 
-		if (event.start.clone().add(startDelta) < eventEnd) {
+		if (origRange.getStart().add(startDelta) < origRange.getEnd()) {
 
 			dateMutation = new EventDefDateMutation();
 			dateMutation.setStartDelta(startDelta);
@@ -841,16 +882,16 @@ Grid.mixin({
 
 
 	// Returns new date-information for an event segment being resized from its end
-	computeEventEndResizeMutation: function(startFootprint, endFootprint, event) {
+	computeEventEndResizeMutation: function(startFootprint, endFootprint, origEventFootprint) {
+		var origRange = origEventFootprint.componentFootprint.unzonedRange;
 		var endDelta = this.diffDates(
 			endFootprint.unzonedRange.getEnd(),
 			startFootprint.unzonedRange.getEnd()
 		);
-		var eventEnd = this.view.calendar.getEventEnd(event);
 		var dateMutation;
 		var eventDefMutation;
 
-		if (eventEnd.add(endDelta) > event.start) {
+		if (origRange.getEnd().add(endDelta) > origRange.getStart()) {
 
 			dateMutation = new EventDefDateMutation();
 			dateMutation.setEndDelta(endDelta);

+ 41 - 12
src/common/View.js

@@ -726,18 +726,26 @@ var View = FC.View = ChronoComponent.extend({
 	------------------------------------------------------------------------------------------------------------------*/
 
 
-	reportEventDrop: function(legacyEvent, eventMutation, el, ev) {
+	reportEventDrop: function(eventInstance, eventMutation, el, ev) {
 		var eventManager = this.calendar.eventManager;
-		var eventDef = eventManager.getEventDefByUid(legacyEvent._id);
 		var undoFunc = eventManager.mutateEventsWithId(
-			eventDef.id,
+			eventInstance.def.id,
 			eventMutation,
 			this.calendar
 		);
 		var dateMutation = eventMutation.dateMutation;
 
+		// update the EventInstance, for handlers
+		if (dateMutation) {
+			eventInstance.dateProfile = dateMutation.buildNewDateProfile(
+				eventInstance.dateProfile,
+				this.calendar
+			);
+		}
+
 		this.triggerEventDrop(
-			eventManager.getEventInstancesWithId(eventDef.id)[0].toLegacy(),
+			eventInstance,
+			// a drop doesn't necessarily mean a date mutation (ex: resource change)
 			(dateMutation && dateMutation.dateDelta) || moment.duration(),
 			undoFunc,
 			el, ev
@@ -746,8 +754,16 @@ var View = FC.View = ChronoComponent.extend({
 
 
 	// Triggers event-drop handlers that have subscribed via the API
-	triggerEventDrop: function(event, dateDelta, undoFunc, el, ev) {
-		this.publiclyTrigger('eventDrop', el[0], event, dateDelta, undoFunc, ev, {}); // {} = jqui dummy
+	triggerEventDrop: function(eventInstance, dateDelta, undoFunc, el, ev) {
+		this.publiclyTrigger(
+			'eventDrop',
+			el[0],
+			eventInstance.toLegacy(),
+			dateDelta,
+			undoFunc,
+			ev,
+			{} // {} = jqui dummy
+		);
 	},
 
 
@@ -790,17 +806,22 @@ var View = FC.View = ChronoComponent.extend({
 
 
 	// Must be called when an event in the view has been resized to a new length
-	reportEventResize: function(legacyEvent, eventMutation, el, ev) {
+	reportEventResize: function(eventInstance, eventMutation, el, ev) {
 		var eventManager = this.calendar.eventManager;
-		var eventDef = eventManager.getEventDefByUid(legacyEvent._id);
 		var undoFunc = eventManager.mutateEventsWithId(
-			eventDef.id,
+			eventInstance.def.id,
 			eventMutation,
 			this.calendar
 		);
 
+		// update the EventInstance, for handlers
+		eventInstance.dateProfile = eventMutation.dateMutation.buildNewDateProfile(
+			eventInstance.dateProfile,
+			this.calendar
+		);
+
 		this.triggerEventResize(
-			eventManager.getEventInstancesWithId(eventDef.id)[0].toLegacy(),
+			eventInstance,
 			eventMutation.dateMutation.endDelta,
 			undoFunc,
 			el, ev
@@ -809,8 +830,16 @@ var View = FC.View = ChronoComponent.extend({
 
 
 	// Triggers event-resize handlers that have subscribed via the API
-	triggerEventResize: function(event, durationDelta, undoFunc, el, ev) {
-		this.publiclyTrigger('eventResize', el[0], event, durationDelta, undoFunc, ev, {}); // {} = jqui dummy
+	triggerEventResize: function(eventInstance, durationDelta, undoFunc, el, ev) {
+		this.publiclyTrigger(
+			'eventResize',
+			el[0],
+			eventInstance.toLegacy(),
+			durationDelta,
+			undoFunc,
+			ev,
+			{} // {} = jqui dummy
+		);
 	},