Merge pull request #511 from taigaio/issue/2842/infinite-scroll

fix infinite scroll in large screen with few items at start
stable
Alejandro 2015-06-11 06:14:25 -07:00
commit 9bfd723dcb
2 changed files with 59 additions and 11 deletions

View File

@ -28,6 +28,7 @@ class UserTimelineController extends mixOf(taiga.Controller, taiga.PageMixin, ta
"tgUserTimelineService" "tgUserTimelineService"
] ]
min: 20
constructor: (@userTimelineService) -> constructor: (@userTimelineService) ->
@.timelineList = Immutable.List() @.timelineList = Immutable.List()
@.page = 1 @.page = 1
@ -36,21 +37,27 @@ class UserTimelineController extends mixOf(taiga.Controller, taiga.PageMixin, ta
loadTimeline: () -> loadTimeline: () ->
@.scrollDisabled = true @.scrollDisabled = true
promise = null
if @.projectId if @.projectId
@userTimelineService promise = @userTimelineService
.getProjectTimeline(@.projectId, @.page) .getProjectTimeline(@.projectId, @.page)
.then (newTimelineList) =>
@._timelineLoaded(newTimelineList)
else if @.currentUser else if @.currentUser
@userTimelineService promise = @userTimelineService
.getProfileTimeline(@.user.get("id"), @.page) .getProfileTimeline(@.user.get("id"), @.page)
.then (newTimelineList) =>
@._timelineLoaded(newTimelineList)
else else
@userTimelineService promise = @userTimelineService
.getUserTimeline(@.user.get("id"), @.page) .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) -> _timelineLoaded: (newTimelineList) ->
@.timelineList = @.timelineList.concat(newTimelineList) @.timelineList = @.timelineList.concat(newTimelineList)

View File

@ -41,6 +41,22 @@ describe "UserTimelineController", ->
beforeEach () -> beforeEach () ->
timelineList = Immutable.fromJS([ 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"}, { fake: "fake"},
{ fake: "fake"}, { fake: "fake"},
@ -134,7 +150,32 @@ describe "UserTimelineController", ->
myCtrl._timelineLoaded(timelineList) myCtrl._timelineLoaded(timelineList)
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", () -> it "project timeline items", () ->
myCtrl = controller "UserTimeline" myCtrl = controller "UserTimeline"
@ -153,5 +194,5 @@ describe "UserTimelineController", ->
thenStub.callArgWith(0, timelineList) 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) expect(myCtrl.page).to.equal(2)