ソースを参照

fix daygrid slicing. fixes #3856

Adam Shaw 8 年 前
コミット
ddbffb8547

+ 21 - 4
src/basic/DayGrid.limit.js

@@ -329,12 +329,29 @@ DayGrid.mixin({
 		var dayEnd = dayStart.clone().add(1, 'days');
 		var dayRange = new UnzonedRange(dayStart, dayEnd);
 		var newSegs = [];
-		var i;
+		var i, seg;
+		var slicedRange;
 
 		for (i = 0; i < segs.length; i++) {
-			newSegs.push.apply(newSegs, // append
-				this.eventFootprintToSegs(segs[i].footprint, dayRange)
-			);
+			seg = segs[i];
+			slicedRange = seg.footprint.componentFootprint.unzonedRange.intersect(dayRange);
+
+			if (slicedRange) {
+				newSegs.push(
+					$.extend({}, seg, {
+						footprint: new EventFootprint(
+							new ComponentFootprint(
+								slicedRange,
+								seg.footprint.componentFootprint.isAllDay
+							),
+							seg.footprint.eventDef,
+							seg.footprint.eventInstance
+						),
+						isStart: seg.isStart && slicedRange.isStart,
+						isEnd: seg.isEnd && slicedRange.isEnd
+					})
+				);
+			}
 		}
 
 		// force an order because eventsToSegs doesn't guarantee one

+ 1 - 6
src/component/DateComponent.js

@@ -568,16 +568,11 @@ var DateComponent = FC.DateComponent = Component.extend({
 	// Given an event's span (unzoned start/end and other misc data), and the event itself,
 	// slices into segments and attaches event-derived properties to them.
 	// eventSpan - { start, end, isStart, isEnd, otherthings... }
-	// constraintRange allow additional clipping. optional. eventually remove this.
-	eventFootprintToSegs: function(eventFootprint, constraintRange) {
+	eventFootprintToSegs: function(eventFootprint) {
 		var unzonedRange = eventFootprint.componentFootprint.unzonedRange;
 		var segs;
 		var i, seg;
 
-		if (constraintRange) {
-			unzonedRange = unzonedRange.intersect(constraintRange);
-		}
-
 		segs = this.componentFootprintToSegs(eventFootprint.componentFootprint);
 
 		for (i = 0; i < segs.length; i++) {

+ 52 - 0
tests/legacy/eventLimit-popover.js

@@ -156,6 +156,58 @@ describe('eventLimit popover', function() {
 				'event01', 'event05', 'event07', 'event03', 'event02', 'event08', 'event04'
 			]);
 		});
+
+		// https://github.com/fullcalendar/fullcalendar/issues/3856
+		it('displays multi-day events only once', function() {
+			options.defaultDate = '2017-10-04';
+			options.events = [
+				{
+					title: 'Long event',
+					className: 'long-event',
+					start: '2017-10-03',
+					end: '2017-10-20'
+				},
+				{
+					title: 'Meeting',
+					className: 'meeting-event',
+					start: '2017-10-04T10:00:00',
+					end: '2017-10-04T12:00:00'
+				},
+				{
+					title: 'Lunch 1',
+					className: 'lunch1-event',
+					start: '2017-10-04T12:00:00'
+				},
+				{
+					title: 'Lunch 2',
+					className: 'lunch2-event',
+					start: '2017-10-04T14:00:00'
+				}
+			]
+
+			init();
+
+			expect($('.fc-popover .fc-event').length).toBe(4);
+
+			var longEventEl = $('.fc-popover .long-event');
+			expect(longEventEl.length).toBe(1);
+			expect(longEventEl).toHaveClass('fc-not-start');
+			expect(longEventEl).toHaveClass('fc-not-end');
+			expect(longEventEl).not.toHaveClass('fc-start');
+			expect(longEventEl).not.toHaveClass('fc-end');
+
+			[
+				$('.fc-popover .meeting-event'),
+				$('.fc-popover .lunch1-event'),
+				$('.fc-popover .lunch2-event')
+			].forEach(function(el) {
+				expect(el.length).toBe(1);
+				expect(el).toHaveClass('fc-start');
+				expect(el).toHaveClass('fc-end');
+				expect(el).not.toHaveClass('fc-not-start');
+				expect(el).not.toHaveClass('fc-not-end');
+			});
+		});
 	});
 
 	[ 'basicWeek', 'agendaWeek' ].forEach(function(viewName) {