Procházet zdrojové kódy

use eventDef for determining dragging/resizing

Adam Shaw před 8 roky
rodič
revize
6218145567

+ 24 - 32
src/common/ChronoComponent.js

@@ -303,34 +303,33 @@ var ChronoComponent = Model.extend({
 
 
 	// Computes if the given event is allowed to be dragged by the user
-	isEventDraggable: function(event) {
-		return this.isEventStartEditable(event);
+	isEventDefDraggable: function(eventDef) {
+		return this.isEventDefStartEditable(eventDef);
 	},
 
 
-	isEventStartEditable: function(event) {
-		var isEditable = event.startEditable;
+	isEventDefStartEditable: function(eventDef) {
+		var isEditable = eventDef.isStartExplicitlyEditable();
+
 		if (isEditable == null) {
-			isEditable = event.source.startEditable;
+			isEditable = this.opt('eventStartEditable');
+
 			if (isEditable == null) {
-				isEditable = this.opt('eventStartEditable');
-				if (isEditable == null) {
-					isEditable = this.isEventGenerallyEditable(event);
-				}
+				isEditable = this.isEventDefGenerallyEditable(eventDef);
 			}
 		}
+
 		return isEditable;
 	},
 
 
-	isEventGenerallyEditable: function(event) {
-		var isEditable = event.editable;
+	isEventDefGenerallyEditable: function(eventDef) {
+		var isEditable = eventDef.isExplicitlyEditable();
+
 		if (isEditable == null) {
-			isEditable = event.source.editable;
-			if (isEditable == null) {
-				isEditable = this.opt('editable');
-			}
+			isEditable = this.opt('editable');
 		}
+
 		return isEditable;
 	},
 
@@ -340,33 +339,26 @@ var ChronoComponent = Model.extend({
 
 
 	// Computes if the given event is allowed to be resized from its starting edge
-	isEventResizableFromStart: function(event) {
-		return this.opt('eventResizableFromStart') && this.isEventResizable(event);
+	isEventDefResizableFromStart: function(eventDef) {
+		return this.opt('eventResizableFromStart') && this.isEventDefResizable(eventDef);
 	},
 
 
 	// Computes if the given event is allowed to be resized from its ending edge
-	isEventResizableFromEnd: function(event) {
-		return this.isEventResizable(event);
+	isEventDefResizableFromEnd: function(eventDef) {
+		return this.isEventDefResizable(eventDef);
 	},
 
 
 	// Computes if the given event is allowed to be resized by the user at all
-	isEventResizable: function(event) {
-		var isResizable = event.durationEditable;
+	isEventDefResizable: function(eventDef) {
+		var isResizable = eventDef.isDurationExplicitlyEditable();
+
 		if (isResizable == null) {
-			isResizable = event.source.durationEditable;
+			isResizable = this.opt('eventDurationEditable');
+
 			if (isResizable == null) {
-				isResizable = this.opt('eventDurationEditable');
-				if (isResizable == null) {
-					isResizable = event.editable;
-					if (isResizable == null) {
-						isResizable = event.source.editable;
-						if (isResizable == null) {
-							isResizable = this.opt('editable');
-						}
-					}
-				}
+				isResizable = this.isEventDefGenerallyEditable(eventDef);
 			}
 		}
 		return isResizable;

+ 5 - 4
src/common/DayGrid.events.js

@@ -91,12 +91,13 @@ DayGrid.mixin({
 	// Builds the HTML to be used for the default element for an individual segment
 	fgSegHtml: function(seg, disableResizing) {
 		var view = this.view;
-		var event = seg.event;
-		var isDraggable = view.isEventDraggable(event);
+		var event = seg.event; // TODO: kill
+		var eventDef = seg.footprint.eventDef;
+		var isDraggable = view.isEventDefDraggable(eventDef);
 		var isResizableFromStart = !disableResizing && event.allDay &&
-			seg.isStart && view.isEventResizableFromStart(event);
+			seg.isStart && view.isEventDefResizableFromStart(eventDef);
 		var isResizableFromEnd = !disableResizing && event.allDay &&
-			seg.isEnd && view.isEventResizableFromEnd(event);
+			seg.isEnd && view.isEventDefResizableFromEnd(eventDef);
 		var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);
 		var skinCss = cssToStr(this.getSegSkinCss(seg));
 		var timeHtml = '';

+ 7 - 6
src/common/Grid.events.js

@@ -219,7 +219,7 @@ Grid.mixin({
 			!this.mousedOverSeg
 		) {
 			this.mousedOverSeg = seg;
-			if (this.view.isEventResizable(seg.event)) {
+			if (this.view.isEventDefResizable(seg.footprint.eventDef)) {
 				seg.el.addClass('fc-allow-mouse-resize');
 			}
 			this.view.publiclyTrigger('eventMouseover', seg.el[0], seg.event, ev);
@@ -235,7 +235,7 @@ 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.isEventResizable(seg.event)) {
+			if (this.view.isEventDefResizable(seg.footprint.eventDef)) {
 				seg.el.removeClass('fc-allow-mouse-resize');
 			}
 			this.view.publiclyTrigger('eventMouseout', seg.el[0], seg.event, ev);
@@ -246,7 +246,7 @@ Grid.mixin({
 	handleSegMousedown: function(seg, ev) {
 		var isResizing = this.startSegResize(seg, ev, { distance: 5 });
 
-		if (!isResizing && this.view.isEventDraggable(seg.event)) {
+		if (!isResizing && this.view.isEventDefDraggable(seg.footprint.eventDef)) {
 			this.buildSegDragListener(seg)
 				.startInteraction(ev, {
 					distance: 5
@@ -257,10 +257,11 @@ Grid.mixin({
 
 	handleSegTouchStart: function(seg, ev) {
 		var view = this.view;
-		var event = seg.event;
+		var event = seg.event; // TODO: kill
+		var eventDef = seg.footprint.eventDef;
 		var isSelected = view.isEventSelected(event);
-		var isDraggable = view.isEventDraggable(event);
-		var isResizable = view.isEventResizable(event);
+		var isDraggable = view.isEventDefDraggable(eventDef);
+		var isResizable = view.isEventDefResizable(eventDef);
 		var isResizing = false;
 		var dragListener;
 		var eventLongPressDelay;

+ 5 - 4
src/common/TimeGrid.events.js

@@ -248,10 +248,11 @@ TimeGrid.mixin({
 		var view = this.view;
 		var componentFootprint = seg.footprint.componentFootprint;
 		var isAllDay = componentFootprint.isAllDay;
-		var event = seg.event;
-		var isDraggable = view.isEventDraggable(event);
-		var isResizableFromStart = !disableResizing && seg.isStart && view.isEventResizableFromStart(event);
-		var isResizableFromEnd = !disableResizing && seg.isEnd && view.isEventResizableFromEnd(event);
+		var event = seg.event; // TODO: kill
+		var eventDef = seg.footprint.eventDef;
+		var isDraggable = view.isEventDefDraggable(eventDef);
+		var isResizableFromStart = !disableResizing && seg.isStart && view.isEventDefResizableFromStart(eventDef);
+		var isResizableFromEnd = !disableResizing && seg.isEnd && view.isEventDefResizableFromEnd(eventDef);
 		var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);
 		var skinCss = cssToStr(this.getSegSkinCss(seg));
 		var timeText;

+ 2 - 2
src/list/ListView.js

@@ -46,11 +46,11 @@ var ListView = View.extend({
 		this.grid.setRange(this.renderUnzonedRange); // needs to process range-related options
 	},
 
-	isEventResizable: function(event) {
+	isEventDefResizable: function(eventDef) {
 		return false;
 	},
 
-	isEventDraggable: function(event) {
+	isEventDefDraggable: function(eventDef) {
 		return false;
 	}
 

+ 29 - 2
src/models/event/EventDef.js

@@ -88,7 +88,7 @@ var EventDef = FC.EventDef = Class.extend(ParsableModelMixin, {
 			return this.source.constraint;
 		}
 
-		return this.source.calendar.opt('eventConstraint');
+		return this.source.calendar.opt('eventConstraint'); // what about View option?
 	},
 
 
@@ -101,7 +101,34 @@ var EventDef = FC.EventDef = Class.extend(ParsableModelMixin, {
 			return this.source.overlap;
 		}
 
-		return this.source.calendar.opt('eventOverlap');
+		return this.source.calendar.opt('eventOverlap'); // what about View option?
+	},
+
+
+	isStartExplicitlyEditable: function() {
+		if (this.startEditable !== null) {
+			return this.startEditable;
+		}
+
+		return this.source.startEditable;
+	},
+
+
+	isDurationExplicitlyEditable: function() {
+		if (this.durationEditable !== null) {
+			return this.durationEditable;
+		}
+
+		return this.source.durationEditable;
+	},
+
+
+	isExplicitlyEditable: function() {
+		if (this.editable !== null) {
+			return this.editable;
+		}
+
+		return this.source.editable;
 	},