Просмотр исходного кода

external drop uses real SingleEventDef

Adam Shaw 8 лет назад
Родитель
Сommit
dec7e9f809
4 измененных файлов с 35 добавлено и 21 удалено
  1. 6 0
      src/EventManager.js
  2. 13 4
      src/common/Grid.events.js
  3. 12 16
      src/common/View.js
  4. 4 1
      src/models/EventInstanceGroup.js

+ 6 - 0
src/EventManager.js

@@ -671,6 +671,12 @@ function EventManager() { // assumed to be a calendar
 	}
 
 
+	t.addEventDef = function(eventDef, isSticky) { // TODO: respect isSticky
+		eventDefCollection.add(eventDef);
+		reportEventChange();
+	};
+
+
 	function removeEvents(filter) {
 		var eventID;
 		var i;

+ 13 - 4
src/common/Grid.events.js

@@ -599,7 +599,12 @@ Grid.mixin({
 			interactionEnd: function(ev) {
 
 				if (singleEventDef) { // element was dropped on a valid hit
-					view.reportExternalDrop(meta, singleEventDef, el, ev, ui);
+					view.reportExternalDrop(
+						singleEventDef,
+						Boolean(meta.eventProps), // isEvent
+						Boolean(meta.stick), // isSticky
+						el, ev, ui
+					);
 				}
 
 				_this.isDraggingExternal = false;
@@ -638,9 +643,13 @@ Grid.mixin({
 			}
 		}
 
-		eventDef = new SingleEventDefinition();
-		eventDef.start = start;
-		eventDef.end = end;
+		eventDef = SingleEventDefinition.parse(
+			$.extend({}, meta.eventProps, {
+				start: start,
+				end: end
+			}),
+			calendar
+		);
 
 		return eventDef;
 	},

+ 12 - 16
src/common/View.js

@@ -736,33 +736,29 @@ var View = FC.View = ChronoComponent.extend({
 	// Must be called when an external element, via jQuery UI, has been dropped onto the calendar.
 	// `meta` is the parsed data that has been embedded into the dragging event.
 	// `dropLocation` is an object that contains the new zoned start/end/allDay values for the event.
-	reportExternalDrop: function(meta, singleEventDef, el, ev, ui) {
-		var eventProps = meta.eventProps;
-		var eventInput;
-		var event;
+	reportExternalDrop: function(singleEventDef, isEvent, isSticky, el, ev, ui) {
 
-		// Try to build an event object and render it. TODO: decouple the two
-		// TODO: use singleEventDef directly without reparsing. but meta's props inside the def beforehand.
-		if (eventProps) {
-			eventInput = $.extend({}, eventProps, {
-				start: singleEventDef.start,
-				end: singleEventDef.end
-			});
-			event = this.calendar.renderEvent(eventInput, meta.stick)[0]; // renderEvent returns an array
+		if (isEvent) {
+			this.calendar.addEventDef(singleEventDef, isSticky);
 		}
 
-		this.triggerExternalDrop(event, singleEventDef, el, ev, ui);
+		this.triggerExternalDrop(singleEventDef, isEvent, el, ev, ui);
 	},
 
 
 	// Triggers external-drop handlers that have subscribed via the API
-	triggerExternalDrop: function(event, singleEventDef, el, ev, ui) {
+	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);
 
-		if (event) {
-			this.publiclyTrigger('eventReceive', null, event); // signal an external event landed
+		if (isEvent) {
+			// signal an external event landed
+			this.publiclyTrigger(
+				'eventReceive',
+				null,
+				singleEventDef.buildInstances()[0].toLegacy()
+			);
 		}
 	},
 

+ 4 - 1
src/models/EventInstanceGroup.js

@@ -33,7 +33,10 @@ var EventInstanceGroup = Class.extend({
 			eventInstance = eventInstances[i];
 
 			dateRange = eventInstance.eventDateProfile.buildRange(calendar);
-			dateRange = dateRange.constrainTo(constraintRange);
+
+			if (constraintRange) {
+				dateRange = dateRange.constrainTo(constraintRange);
+			}
 
 			if (dateRange) {
 				eventRanges.push(