From 4fa7a6d639f96dd45dd7563bdf0a2bd5949e7140 Mon Sep 17 00:00:00 2001 From: Juanfran Date: Thu, 11 Jun 2015 14:47:28 +0200 Subject: [PATCH] fix infinite scroll in large screen with few items at start --- .../user-timeline.controller.coffee | 25 +++++++---- .../user-timeline.controller.spec.coffee | 45 ++++++++++++++++++- 2 files changed, 59 insertions(+), 11 deletions(-) diff --git a/app/modules/user-timeline/user-timeline/user-timeline.controller.coffee b/app/modules/user-timeline/user-timeline/user-timeline.controller.coffee index a4e19031..bea5652a 100644 --- a/app/modules/user-timeline/user-timeline/user-timeline.controller.coffee +++ b/app/modules/user-timeline/user-timeline/user-timeline.controller.coffee @@ -28,6 +28,7 @@ class UserTimelineController extends mixOf(taiga.Controller, taiga.PageMixin, ta "tgUserTimelineService" ] + min: 20 constructor: (@userTimelineService) -> @.timelineList = Immutable.List() @.page = 1 @@ -36,21 +37,27 @@ class UserTimelineController extends mixOf(taiga.Controller, taiga.PageMixin, ta loadTimeline: () -> @.scrollDisabled = true + promise = null + if @.projectId - @userTimelineService + promise = @userTimelineService .getProjectTimeline(@.projectId, @.page) - .then (newTimelineList) => - @._timelineLoaded(newTimelineList) else if @.currentUser - @userTimelineService + promise = @userTimelineService .getProfileTimeline(@.user.get("id"), @.page) - .then (newTimelineList) => - @._timelineLoaded(newTimelineList) else - @userTimelineService + promise = @userTimelineService .getUserTimeline(@.user.get("id"), @.page) - .then (newTimelineList) => - @._timelineLoaded(newTimelineList) + + promise.then (list) => + @._timelineLoaded(list) + + if !@.scrollDisabled && @.timelineList.size < @.min + return @.loadTimeline() + + return @.timelineList + + return promise _timelineLoaded: (newTimelineList) -> @.timelineList = @.timelineList.concat(newTimelineList) diff --git a/app/modules/user-timeline/user-timeline/user-timeline.controller.spec.coffee b/app/modules/user-timeline/user-timeline/user-timeline.controller.spec.coffee index ce4c8710..925a16f3 100644 --- a/app/modules/user-timeline/user-timeline/user-timeline.controller.spec.coffee +++ b/app/modules/user-timeline/user-timeline/user-timeline.controller.spec.coffee @@ -41,6 +41,22 @@ describe "UserTimelineController", -> beforeEach () -> timelineList = Immutable.fromJS([ + { fake: "fake"}, + { fake: "fake"}, + { fake: "fake"}, + { fake: "fake"}, + { fake: "fake"}, + { fake: "fake"}, + { fake: "fake"}, + { fake: "fake"}, + { fake: "fake"}, + { fake: "fake"}, + { fake: "fake"}, + { fake: "fake"}, + { fake: "fake"}, + { fake: "fake"}, + { fake: "fake"}, + { fake: "fake"}, { fake: "fake"}, { fake: "fake"}, { fake: "fake"}, @@ -134,7 +150,32 @@ describe "UserTimelineController", -> myCtrl._timelineLoaded(timelineList) myCtrl._timelineLoaded(timelineList) - expect(myCtrl.timelineList.size).to.be.eql(8) + expect(myCtrl.timelineList.size).to.be.eql(40) + + it "call next page until reach de min items", (done) -> + myCtrl = controller "UserTimeline" + myCtrl.user = mockUser + myCtrl.currentUser = true + + mocks.userTimelineService.getProfileTimeline = sinon.stub().promise() + + timelineList = Immutable.fromJS([ + { fake: "fake"}, + { fake: "fake"}, + { fake: "fake"}, + { fake: "fake"}, + { fake: "fake"} + ]) + + promise = myCtrl.loadTimeline(timelineList) + + myCtrl.loadTimeline = sinon.spy() + + mocks.userTimelineService.getProfileTimeline.resolve(timelineList) + + promise.then () -> + expect(myCtrl.loadTimeline).to.be.calledOnce + done() it "project timeline items", () -> myCtrl = controller "UserTimeline" @@ -153,5 +194,5 @@ describe "UserTimelineController", -> thenStub.callArgWith(0, timelineList) - expect(myCtrl.timelineList.size).to.be.eql(4) + expect(myCtrl.timelineList.size).to.be.eql(20) expect(myCtrl.page).to.equal(2)