Merge pull request #969 from taigaio/backlog-pagination

backlog pagination
stable
Alejandro 2016-04-20 10:50:57 +02:00
commit 0e3e30d48e
5 changed files with 55 additions and 6 deletions

View File

@ -97,6 +97,8 @@ BacklogFiltersDirective = ($q, $log, $location, $template, $compile) ->
reloadUserstories = () -> reloadUserstories = () ->
currentFiltersType = getFiltersType() currentFiltersType = getFiltersType()
$ctrl.resetBacklogPagination()
$q.all([$ctrl.loadUserstories(), $ctrl.generateFilters()]).then () -> $q.all([$ctrl.loadUserstories(), $ctrl.generateFilters()]).then () ->
currentFilters = $scope.filters[currentFiltersType] currentFilters = $scope.filters[currentFiltersType]
renderFilters(_.reject(currentFilters, "selected")) renderFilters(_.reject(currentFilters, "selected"))

View File

@ -62,6 +62,10 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
@location, @appMetaService, @navUrls, @events, @analytics, @translate, @loading, @rs2) -> @location, @appMetaService, @navUrls, @events, @analytics, @translate, @loading, @rs2) ->
bindMethods(@) bindMethods(@)
@.page = 1
@.disablePagination = false
@scope.userstories = []
@scope.sectionName = @translate.instant("BACKLOG.SECTION_NAME") @scope.sectionName = @translate.instant("BACKLOG.SECTION_NAME")
@showTags = false @showTags = false
@activeFilters = false @activeFilters = false
@ -88,8 +92,13 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
# On Error # On Error
promise.then null, @.onInitialDataError.bind(@) promise.then null, @.onInitialDataError.bind(@)
resetBacklogPagination: ->
@.page = 1
@scope.userstories = []
initializeEventHandlers: -> initializeEventHandlers: ->
@scope.$on "usform:bulk:success", => @scope.$on "usform:bulk:success", =>
@.resetBacklogPagination()
@.loadUserstories() @.loadUserstories()
@.loadProjectStats() @.loadProjectStats()
@analytics.trackEvent("userstory", "create", "bulk create userstory on backlog", 1) @analytics.trackEvent("userstory", "create", "bulk create userstory on backlog", 1)
@ -100,6 +109,7 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
@analytics.trackEvent("sprint", "create", "create sprint on backlog", 1) @analytics.trackEvent("sprint", "create", "create sprint on backlog", 1)
@scope.$on "usform:new:success", => @scope.$on "usform:new:success", =>
@.resetBacklogPagination()
@.loadUserstories() @.loadUserstories()
@.loadProjectStats() @.loadProjectStats()
@ -110,6 +120,7 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
@.loadProjectStats() @.loadProjectStats()
@scope.$on "sprintform:remove:success", (event, sprint) => @scope.$on "sprintform:remove:success", (event, sprint) =>
@.resetBacklogPagination()
@.loadSprints() @.loadSprints()
@.loadProjectStats() @.loadProjectStats()
@.loadUserstories() @.loadUserstories()
@ -119,8 +130,12 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
@rootscope.$broadcast("filters:update") @rootscope.$broadcast("filters:update")
@scope.$on "usform:edit:success", => @scope.$on "usform:edit:success", (event, data) =>
@.loadUserstories() index = _.findIndex @scope.userstories, (us) ->
return us.id == data.id
@scope.userstories[index] = data
@rootscope.$broadcast("filters:update") @rootscope.$broadcast("filters:update")
@scope.$on("sprint:us:move", @.moveUs) @scope.$on("sprint:us:move", @.moveUs)
@ -249,17 +264,30 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
@.loadUserstories() @.loadUserstories()
loadUserstories: -> loadUserstories: ->
@.loadingUserstories = true
@.disablePagination = true
@scope.httpParams = @.getUrlFilters() @scope.httpParams = @.getUrlFilters()
@rs.userstories.storeQueryParams(@scope.projectId, @scope.httpParams) @rs.userstories.storeQueryParams(@scope.projectId, @scope.httpParams)
@scope.httpParams.page = @.page
promise = @rs.userstories.listUnassigned(@scope.projectId, @scope.httpParams) promise = @rs.userstories.listUnassigned(@scope.projectId, @scope.httpParams)
return promise.then (userstories) => return promise.then (result) =>
userstories = result[0]
header = result[1]
# NOTE: Fix order of USs because the filter orderBy does not work propertly in the partials files # NOTE: Fix order of USs because the filter orderBy does not work propertly in the partials files
@scope.userstories = _.sortBy(userstories, "backlog_order") @scope.userstories = @scope.userstories.concat(_.sortBy(userstories, "backlog_order"))
@.setSearchDataFilters() @.setSearchDataFilters()
@.loadingUserstories = false
if header('x-pagination-next')
@.disablePagination = false
@.page++
# The broadcast must be executed when the DOM has been fully reloaded. # The broadcast must be executed when the DOM has been fully reloaded.
# We can't assure when this exactly happens so we need a defer # We can't assure when this exactly happens so we need a defer
scopeDefer @scope, => scopeDefer @scope, =>

View File

@ -51,7 +51,9 @@ resourceProvider = ($repo, $http, $urls, $storage) ->
params = {"project": projectId, "milestone": "null"} params = {"project": projectId, "milestone": "null"}
params = _.extend({}, params, filters or {}) params = _.extend({}, params, filters or {})
service.storeQueryParams(projectId, params) service.storeQueryParams(projectId, params)
return $repo.queryMany("userstories", params) return $repo.queryMany("userstories", params, {
enablePagination: true
}, true)
service.listAll = (projectId, filters) -> service.listAll = (projectId, filters) ->
params = {"project": projectId} params = {"project": projectId}

View File

@ -8,5 +8,13 @@ div.backlog-table-header
span.header-points(translate="COMMON.FIELDS.POINTS") span.header-points(translate="COMMON.FIELDS.POINTS")
tg-svg(svg-icon="icon-arrow-down") tg-svg(svg-icon="icon-arrow-down")
div.backlog-table-body(tg-backlog-sortable, ng-class="{'show-tags': ctrl.showTags, 'active-filters': ctrl.activeFilters}" ) div.backlog-table-body(
tg-backlog-sortable,
ng-class="{'show-tags': ctrl.showTags, 'active-filters': ctrl.activeFilters}"
infinite-scroll="ctrl.loadUserstories()"
infinite-scroll-disabled="ctrl.disablePagination"
infinite-scroll-immediate-check='false'
)
include ../components/backlog-row include ../components/backlog-row
div(tg-loading="ctrl.loadingUserstories")

View File

@ -286,6 +286,15 @@
display: inline-block; display: inline-block;
} }
} }
.loading {
margin: 2% auto;
width: 3rem;
img {
@extend %loading-spinner;
max-height: 3rem;
max-width: 3rem;
}
}
} }
.empty-backlog { .empty-backlog {