Ver código fonte

move more rendering responsbility into EventRenderer

Adam Shaw 8 anos atrás
pai
commit
e53d14b127

+ 1 - 9
src/common/DayGridEventRenderer.js

@@ -17,13 +17,7 @@ var DayGridEventRenderer = EventRenderer.extend({
 
 	// Renders the given foreground event segments onto the grid
 	renderFgSegs: function(segs) {
-		var rowStructs;
-
-		// render an `.el` on each seg
-		// returns a subset of the segs. segs that were actually rendered
-		segs = this.renderFgSegEls(segs);
-
-		rowStructs = this.rowStructs = this.renderSegRows(segs);
+		var rowStructs = this.rowStructs = this.renderSegRows(segs);
 
 		// append to each row's content skeleton
 		this.dayGrid.rowEls.each(function(i, rowNode) {
@@ -31,8 +25,6 @@ var DayGridEventRenderer = EventRenderer.extend({
 				rowStructs[i].tbodyEl
 			);
 		});
-
-		return segs; // return only the segs that were actually rendered
 	},
 
 

+ 5 - 1
src/common/DayGridHelperRenderer.js

@@ -10,7 +10,11 @@ var DayGridHelperRenderer = HelperRenderer.extend({
 		var helperNodes = [];
 		var rowStructs;
 
-		segs = this.eventRenderer.renderFgSegEls(segs); // assigns each seg's el and returns a subset of segs that were rendered
+		// assigns each seg's el and returns a subset of segs that were rendered
+		// TODO: not good to call eventRenderer this way
+		segs = this.eventRenderer.renderFgSegEls(segs);
+
+		// TODO: not good to call eventRenderer this way
 		rowStructs = this.eventRenderer.renderSegRows(segs);
 
 		// inject each new event skeleton into each associated row

+ 1 - 1
src/common/TimeGrid.js

@@ -402,7 +402,7 @@ var TimeGrid = FC.TimeGrid = ChronoComponent.extend(DayTableMixin, {
 
 		if (isResize) {
 			this.updateSegVerticals(
-				[].concat(this.fgSegs || [], this.bgSegs || [], this.businessSegs || [])
+				[].concat(this.eventRenderer.getSegs(), this.businessSegs || [])
 			);
 		}
 	},

+ 2 - 5
src/common/TimeGridEventRenderer.js

@@ -16,7 +16,7 @@ var TimeGridEventRenderer = EventRenderer.extend({
 
 
 	renderFgSegs: function(segs) {
-		return this.renderFgSegsIntoContainers(segs, this.timeGrid.fgContainerEls);
+		this.renderFgSegsIntoContainers(segs, this.timeGrid.fgContainerEls);
 	},
 
 
@@ -26,7 +26,6 @@ var TimeGridEventRenderer = EventRenderer.extend({
 		var segsByCol;
 		var col;
 
-		segs = this.renderFgSegEls(segs);
 		segsByCol = this.timeGrid.groupSegsByCol(segs);
 
 		for (col = 0; col < this.timeGrid.colCnt; col++) {
@@ -34,13 +33,11 @@ var TimeGridEventRenderer = EventRenderer.extend({
 		}
 
 		this.timeGrid.attachSegsByCol(segsByCol, containerEls);
-
-		return segs;
 	},
 
 
 	unrenderFgSegs: function() {
-		this.timeGrid.fgSegs.forEach(function(seg) {
+		this.fgSegs.forEach(function(seg) {
 			seg.el.remove();
 		});
 	},

+ 6 - 1
src/common/TimeGridHelperRenderer.js

@@ -20,7 +20,12 @@ var TimeGridHelperRenderer = HelperRenderer.extend({
 		var i, seg;
 		var sourceEl;
 
-		segs = this.eventRenderer.renderFgSegsIntoContainers(
+		// assigns each seg's el and returns a subset of segs that were rendered
+		// TODO: not good to call eventRenderer this way
+		segs = this.eventRenderer.renderFgSegEls(segs);
+
+		// TODO: not good to call eventRenderer this way
+		this.eventRenderer.renderFgSegsIntoContainers(
 			segs,
 			this.component.helperContainerEls
 		);

+ 22 - 54
src/component/ChronoComponent.js

@@ -29,9 +29,6 @@ var ChronoComponent = Model.extend({
 	eventResizing: null,
 	externalDropping: null,
 
-	bgSegs: null,
-	fgSegs: null,
-
 	// self-config, overridable by subclasses
 	segSelector: '.fc-event-container > *', // what constitutes an event element?
 
@@ -51,6 +48,12 @@ var ChronoComponent = Model.extend({
 		this.nextDayThreshold = moment.duration(this.opt('nextDayThreshold'));
 		this.isRTL = this.opt('isRTL');
 
+		if (this.fillRendererClass) {
+			this.fillRenderer = new this.fillRendererClass(this);
+		}
+
+		// NOTE: this.fillRenderer needs to already be assigned!
+		// TODO: make ordering not matter
 		if (this.eventRendererClass) {
 			this.eventRenderer = new this.eventRendererClass(this);
 		}
@@ -63,10 +66,6 @@ var ChronoComponent = Model.extend({
 			this.businessHourRenderer = new this.businessHourRendererClass(this);
 		}
 
-		if (this.fillRendererClass) {
-			this.fillRenderer = new this.fillRendererClass(this);
-		}
-
 		if (this.dateSelectingClass) {
 			this.dateClicking = new this.dateClickingClass(this);
 		}
@@ -294,18 +293,18 @@ var ChronoComponent = Model.extend({
 
 
 	renderFgEventFootprints: function(eventFootprints) {
-		var segs = this.eventFootprintsToSegs(eventFootprints);
-
-		this.fgSegs = this.renderFgEventSegs(segs) || segs;
+		if (this.eventRenderer) {
+			this.eventRenderer.renderFgFootprints(eventFootprints);
+		}
 
 		this.callChildren('renderFgEventFootprints', eventFootprints);
 	},
 
 
 	renderBgEventFootprints: function(eventFootprints) {
-		var segs = this.eventFootprintsToSegs(eventFootprints);
-
-		this.bgSegs = this.renderBgEventSegs(segs) || segs;
+		if (this.eventRenderer) {
+			this.eventRenderer.renderBgFootprints(eventFootprints);
+		}
 
 		this.callChildren('renderBgEventFootprints', eventFootprints);
 	},
@@ -313,64 +312,33 @@ var ChronoComponent = Model.extend({
 
 	// Removes event elements from the view.
 	unrenderFgEventFootprints: function() {
-		this.unrenderFgEventSegs();
-		this.fgSegs = null;
-
-		this.callChildren('unrenderFgEventFootprints');
-	},
-
-
-	// Removes event elements from the view.
-	unrenderBgEventFootprints: function() {
-		this.unrenderBgEventSegs();
-		this.bgSegs = null;
-
-		this.callChildren('unrenderBgEventFootprints');
-	},
-
+		this.endInteractions(); // TODO: called too frequently
 
-	// Renders foreground event segments onto the grid. May return a subset of segs that were rendered.
-	renderFgEventSegs: function(segs) {
 		if (this.eventRenderer) {
-			return this.eventRenderer.renderFgSegs(segs);
+			this.eventRenderer.unrenderFgFootprints();
 		}
 
-		return [];
+		this.callChildren('unrenderFgEventFootprints');
 	},
 
 
-	// Unrenders all currently rendered foreground segments
-	unrenderFgEventSegs: function() {
+	// Removes event elements from the view.
+	unrenderBgEventFootprints: function() {
 		this.endInteractions(); // TODO: called too frequently
 
 		if (this.eventRenderer) {
-			this.eventRenderer.unrenderFgSegs();
+			this.eventRenderer.unrenderBgFootprints();
 		}
-	},
-
 
-	// Renders the given background event segments onto the grid.
-	// Returns a subset of the segs that were actually rendered.
-	renderBgEventSegs: function(segs) {
-		this.endInteractions(); // TODO: called too frequently
-
-		if (this.fillRenderer) {
-			this.fillRenderer.render('bgEvent', segs);
-		}
-	},
-
-
-	// Unrenders all the currently rendered background event segments
-	unrenderBgEventSegs: function() {
-		if (this.fillRenderer) {
-			this.fillRenderer.unrender('bgEvent');
-		}
+		this.callChildren('unrenderBgEventFootprints');
 	},
 
 
 	// Retrieves all segment objects that are rendered in the view
 	getEventSegs: function() {
-		var segs = (this.bgSegs || []).concat(this.fgSegs || []);
+		var segs = this.eventRenderer ?
+			this.eventRenderer.getSegs() :
+			[];
 		var children = this.children;
 		var i;
 

+ 59 - 4
src/component/EventRenderer.js

@@ -2,6 +2,11 @@
 var EventRenderer = Class.extend({
 
 	view: null,
+	component: null,
+	fillRenderer: null,
+
+	fgSegs: null,
+	bgSegs: null,
 
 	// derived from options
 	eventTimeFormat: null,
@@ -11,6 +16,8 @@ var EventRenderer = Class.extend({
 
 	constructor: function(component) {
 		this.view = component._getView();
+		this.component = component;
+		this.fillRenderer = component.fillRenderer;
 	},
 
 
@@ -44,9 +51,51 @@ var EventRenderer = Class.extend({
 	},
 
 
-	// Renders foreground event segments onto the grid. May return a subset of segs that were rendered.
+	renderFgFootprints: function(eventFootprints) {
+		var segs = this.component.eventFootprintsToSegs(eventFootprints);
+
+		// render an `.el` on each seg
+		// returns a subset of the segs. segs that were actually rendered
+		segs = this.renderFgSegEls(segs);
+
+		if (this.renderFgSegs(segs) !== false) { // no failure?
+			this.fgSegs = segs;
+		}
+	},
+
+
+	unrenderFgFootprints: function() {
+		this.unrenderFgSegs();
+		this.fgSegs = null;
+	},
+
+
+	renderBgFootprints: function(eventFootprints) {
+		var segs = this.component.eventFootprintsToSegs(eventFootprints);
+
+		if (this.renderBgSegs(segs) !== false) { // no failure?
+			this.bgSegs = segs;
+		}
+	},
+
+
+	unrenderBgFootprints: function() {
+		this.unrenderBgSegs();
+		this.bgSegs = null;
+	},
+
+
+	getSegs: function() {
+		return (this.bgSegs || []).concat(this.fgSegs || []);
+	},
+
+
+	// Renders foreground event segments onto the grid
 	renderFgSegs: function(segs) {
 		// subclasses must implement
+		// segs already has rendered els, and has been filtered.
+
+		return false; // signal failure if not implemented
 	},
 
 
@@ -57,18 +106,24 @@ var EventRenderer = Class.extend({
 
 
 	renderBgSegs: function(segs) {
-		this.fillRenderer.render('bgSegs', segs);
+		if (this.fillRenderer) {
+			this.fillRenderer.render('bgEvent', segs);
+		}
+		else {
+			return false; // signal failure if no fillRenderer
+		}
 	},
 
 
 	unrenderBgSegs: function() {
-		this.fillRenderer.unrender('bgSegs');
+		if (this.fillRenderer) {
+			this.fillRenderer.unrender('bgEvent');
+		}
 	},
 
 
 	// Renders and assigns an `el` property for each foreground event segment.
 	// Only returns segments that successfully rendered.
-	// A utility that subclasses may use.
 	renderFgSegEls: function(segs, disableResizing) {
 		var _this = this;
 		var hasEventRenderHandlers = this.view.hasPublicHandlers('eventRender');

+ 14 - 18
src/list/ListView.js

@@ -120,9 +120,14 @@ var ListView = View.extend({
 
 	eventRendererClass: EventRenderer.extend({
 
-		// like "4:00am"
-		computeEventTimeFormat: function() {
-			return this.opt('mediumTimeFormat');
+
+		renderFgSegs: function(segs) {
+			if (!segs.length) {
+				this.component.renderEmptyMessage();
+			}
+			else {
+				this.component.renderSegList(segs);
+			}
 		},
 
 
@@ -183,6 +188,12 @@ var ListView = View.extend({
 					'</a>' +
 				'</td>' +
 			'</tr>';
+		},
+
+
+		// like "4:00am"
+		computeEventTimeFormat: function() {
+			return this.opt('mediumTimeFormat');
 		}
 
 	}),
@@ -210,21 +221,6 @@ var ListView = View.extend({
 	}),
 
 
-	// returns list of foreground segs that were actually rendered
-	renderFgEventSegs: function(segs) {
-		segs = this.eventRenderer.renderFgSegEls(segs); // might filter away hidden events
-
-		if (!segs.length) {
-			this.renderEmptyMessage();
-		}
-		else {
-			this.renderSegList(segs);
-		}
-
-		return segs;
-	},
-
-
 	renderEmptyMessage: function() {
 		this.contentEl.html(
 			'<div class="fc-list-empty-wrap2">' + // TODO: try less wraps