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

maintain scroll state when calling refetchEvents (fixes a Scheduler bug)

Adam Shaw 10 лет назад
Родитель
Сommit
88b1ad8f1d
2 измененных файлов с 51 добавлено и 0 удалено
  1. 7 0
      src/common/View.js
  2. 44 0
      tests/automated/refetchEvents.js

+ 7 - 0
src/common/View.js

@@ -651,12 +651,19 @@ var View = FC.View = Class.extend({
 
 	// Does everything necessary to clear the view's currently-rendered events
 	clearEvents: function() {
+		var scrollState;
+
 		if (this.isEventsRendered) {
+
+			// TODO: optimize: if we know this is part of a displayEvents call, don't queryScroll/setScroll
+			scrollState = this.queryScroll();
+
 			this.triggerEventUnrender();
 			if (this.destroyEvents) {
 				this.destroyEvents(); // TODO: deprecate
 			}
 			this.unrenderEvents();
+			this.setScroll(scrollState);
 			this.isEventsRendered = false;
 		}
 	},

+ 44 - 0
tests/automated/refetchEvents.js

@@ -0,0 +1,44 @@
+
+describe('when timeline events are rerendered', function() {
+	beforeEach(function() {
+		affix('#cal');
+	});
+
+	it('keeps scroll after refetchEvents', function(done) {
+		var renderCalls = 0;
+
+		$('#cal').fullCalendar({
+			now: '2015-08-07',
+			scrollTime: '00:00',
+			defaultView: 'agendaDay',
+			events: function(start, end, timezone, callback) {
+				setTimeout(function() {
+					callback([
+						{ id: '1', resourceId: 'b', start: '2015-08-07T02:00:00', end: '2015-08-07T07:00:00', title: 'event 1' },
+						{ id: '2', resourceId: 'c', start: '2015-08-07T05:00:00', end: '2015-08-07T22:00:00', title: 'event 2' },
+						{ id: '3', resourceId: 'd', start: '2015-08-06', end: '2015-08-08', title: 'event 3' },
+						{ id: '4', resourceId: 'e', start: '2015-08-07T03:00:00', end: '2015-08-07T08:00:00', title: 'event 4' },
+						{ id: '5', resourceId: 'f', start: '2015-08-07T00:30:00', end: '2015-08-07T02:30:00', title: 'event 5' }
+					]);
+				}, 100);
+			},
+			eventAfterAllRender: function() {
+				var scrollEl = $('.fc-time-grid-container.fc-scroller');
+				renderCalls++
+				if (renderCalls == 1) {
+					setTimeout(function() {
+						scrollEl.scrollTop(100);
+						setTimeout(function() {
+							$('#cal').fullCalendar('refetchEvents');
+						}, 100);
+					}, 100);
+				}
+				else if (renderCalls == 2) {
+					expect(scrollEl.scrollTop()).toBe(100);
+					done();
+				}
+			}
+		});
+	});
+
+});