Excluding closed sprints by default
parent
d027586b9d
commit
a0f9431ae4
|
@ -59,6 +59,7 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
|
|||
@scope.sectionName = "Backlog"
|
||||
@showTags = false
|
||||
@activeFilters = false
|
||||
@excludeClosedSprints = true
|
||||
|
||||
@.initializeEventHandlers()
|
||||
|
||||
|
@ -109,6 +110,8 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
|
|||
@scope.$on("sprint:us:moved", @.loadSprints)
|
||||
@scope.$on("sprint:us:moved", @.loadProjectStats)
|
||||
|
||||
@scope.$on("backlog:toggle-closed-sprints-visualization", @.toggleClosedSprintsVisualization)
|
||||
|
||||
initializeSubscription: ->
|
||||
routingKey1 = "changes.project.#{@scope.projectId}.userstories"
|
||||
@events.subscribe @scope, routingKey1, (message) =>
|
||||
|
@ -143,12 +146,18 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
|
|||
@scope.project.tags_colors = tags_colors
|
||||
|
||||
loadSprints: ->
|
||||
return @rs.sprints.list(@scope.projectId).then (sprints) =>
|
||||
params = {}
|
||||
if @excludeClosedSprints
|
||||
params["closed"] = false
|
||||
|
||||
return @rs.sprints.list(@scope.projectId, params).then (sprints) =>
|
||||
# NOTE: Fix order of USs because the filter orderBy does not work propertly in partials files
|
||||
for sprint in sprints
|
||||
sprint.user_stories = _.sortBy(sprint.user_stories, "sprint_order")
|
||||
|
||||
@scope.sprints = sprints
|
||||
@scope.openSprints = _.filter(sprints, (sprint) => not sprint.closed)
|
||||
@scope.closedSprints = _.filter(sprints, (sprint) => sprint.closed)
|
||||
@scope.sprintsCounter = sprints.length
|
||||
@scope.sprintsById = groupBy(sprints, (x) -> x.id)
|
||||
@rootscope.$broadcast("sprints:loaded", sprints)
|
||||
|
@ -218,6 +227,10 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
|
|||
|
||||
return promise.then(=> @.loadBacklog())
|
||||
|
||||
toggleClosedSprintsVisualization: ->
|
||||
@excludeClosedSprints = not @excludeClosedSprints
|
||||
@.loadSprints()
|
||||
|
||||
filterVisibleUserstories: ->
|
||||
@scope.visibleUserstories = []
|
||||
|
||||
|
|
|
@ -158,3 +158,33 @@ BacklogSprintHeaderDirective = ($navUrls) ->
|
|||
}
|
||||
|
||||
module.directive("tgBacklogSprintHeader", ["$tgNavUrls", "$tgRepo", "$rootScope", BacklogSprintHeaderDirective])
|
||||
|
||||
#############################################################################
|
||||
## Toggle Closed Sprints Directive
|
||||
#############################################################################
|
||||
|
||||
ToggleExcludeClosedSprintsVisualization = ($rootscope, $loading) ->
|
||||
excludeClosedSprints = false
|
||||
|
||||
link = ($scope, $el, $attrs) ->
|
||||
# Event Handlers
|
||||
$el.on "click", "", (event) ->
|
||||
$loading.start($el)
|
||||
$rootscope.$broadcast("backlog:toggle-closed-sprints-visualization")
|
||||
|
||||
$scope.$on "$destroy", ->
|
||||
$el.off()
|
||||
|
||||
$scope.$on "sprints:loaded", (ctx, sprints) =>
|
||||
closedSprints = _.filter(sprints, (sprint) -> sprint.closed)
|
||||
$loading.finish($el)
|
||||
|
||||
#TODO: i18n
|
||||
if closedSprints.length > 0
|
||||
$el.text("Hide closed sprints")
|
||||
else
|
||||
$el.text("Show closed sprints")
|
||||
|
||||
return {link: link}
|
||||
|
||||
module.directive("tgBacklogToggleClosedSprintsVisualization", ["$rootScope", "$tgLoading", ToggleExcludeClosedSprintsVisualization])
|
||||
|
|
|
@ -38,8 +38,9 @@ resourceProvider = ($repo, $model, $storage) ->
|
|||
service.stats = (projectId, sprintId) ->
|
||||
return $repo.queryOneRaw("milestones", "#{sprintId}/stats")
|
||||
|
||||
service.list = (projectId) ->
|
||||
service.list = (projectId, filters) ->
|
||||
params = {"project": projectId}
|
||||
params = _.extend({}, params, filters or {})
|
||||
return $repo.queryMany("milestones", params).then (milestones) =>
|
||||
for m in milestones
|
||||
uses = m.user_stories
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
header(tg-backlog-sprint-header, ng-model="sprint")
|
||||
|
||||
div.sprint-progress-bar(tg-progress-bar="100 * sprint.closed_points / sprint.total_points")
|
||||
|
||||
div.sprint-table(tg-sprint-sortable)
|
||||
div.row.milestone-us-item-row(ng-repeat="us in sprint.user_stories track by us.id")
|
||||
div.column-us
|
||||
a.us-name.clickable(tg-nav="project-userstories-detail:project=project.slug,ref=us.ref",
|
||||
tg-bo-title="'#' + us.ref + ' ' + us.subject",
|
||||
ng-class="{closed: us.is_closed, blocked: us.is_blocked}")
|
||||
span(tg-bo-ref="us.ref")
|
||||
span(tg-bo-bind="us.subject")
|
||||
div.column-points.width-1(tg-bo-bind="us.total_points", ng-class="{closed: us.is_closed, blocked: us.is_blocked}")
|
||||
|
||||
a.button.button-gray(tg-bo-title="'Go to Taskboard of ' + sprint.name",
|
||||
tg-nav="project-taskboard:project=project.slug,sprint=sprint.slug",
|
||||
tg-check-permission="view_milestones")
|
||||
|
||||
span Sprint Taskboard
|
|
@ -4,7 +4,7 @@ section.sprints
|
|||
div.summary
|
||||
ul
|
||||
li
|
||||
span.number(ng-bind="sprintsCounter") --
|
||||
span.number(ng-bind="project.total_milestones") --
|
||||
span.description <br/>sprints
|
||||
div.new-sprint
|
||||
a.button.button-green(href="", title="Add New sprint",
|
||||
|
@ -12,23 +12,11 @@ section.sprints
|
|||
tg-check-permission="add_milestone")
|
||||
span.text + New sprint
|
||||
|
||||
section.sprint(ng-repeat="sprint in sprints track by sprint.id" tg-backlog-sprint="sprint")
|
||||
header(tg-backlog-sprint-header, ng-model="sprint")
|
||||
section.sprint(ng-repeat="sprint in openSprints track by sprint.id" tg-backlog-sprint="sprint")
|
||||
include sprint
|
||||
|
||||
div.sprint-progress-bar(tg-progress-bar="100 * sprint.closed_points / sprint.total_points")
|
||||
div(class="filter-closed-sprints")
|
||||
a(href="", tg-backlog-toggle-closed-sprints-visualization="ctrl.excludeClosedSprints") Show closed sprints
|
||||
|
||||
div.sprint-table(tg-sprint-sortable)
|
||||
div.row.milestone-us-item-row(ng-repeat="us in sprint.user_stories track by us.id")
|
||||
div.column-us
|
||||
a.us-name.clickable(tg-nav="project-userstories-detail:project=project.slug,ref=us.ref",
|
||||
tg-bo-title="'#' + us.ref + ' ' + us.subject",
|
||||
ng-class="{closed: us.is_closed, blocked: us.is_blocked}")
|
||||
span(tg-bo-ref="us.ref")
|
||||
span(tg-bo-bind="us.subject")
|
||||
div.column-points.width-1(tg-bo-bind="us.total_points", ng-class="{closed: us.is_closed, blocked: us.is_blocked}")
|
||||
|
||||
a.button.button-gray(tg-bo-title="'Go to Taskboard of ' + sprint.name",
|
||||
tg-nav="project-taskboard:project=project.slug,sprint=sprint.slug",
|
||||
tg-check-permission="view_milestones")
|
||||
|
||||
span Sprint Taskboard
|
||||
section.sprint(ng-repeat="sprint in closedSprints track by sprint.id" tg-backlog-sprint="sprint")
|
||||
include sprint
|
||||
|
|
|
@ -15,6 +15,12 @@
|
|||
padding: .5rem 1.5rem;
|
||||
}
|
||||
}
|
||||
.filter-closed-sprints {
|
||||
font-family: 'OpenSans-CondLight', Arial, Helvetica, sans-serif;
|
||||
font-size: 1.2rem;
|
||||
margin-bottom: 2rem;
|
||||
margin-top: 2rem;
|
||||
}
|
||||
.sprint-name {
|
||||
a {
|
||||
@extend %large;
|
||||
|
|
Loading…
Reference in New Issue