new baclklog/issues filters implementation
- all filter attributes are OR except tagsstable
parent
74193e681f
commit
f98bb43c1d
|
@ -35,7 +35,7 @@ module = angular.module("taigaBacklog")
|
||||||
## Issues Filters Directive
|
## Issues Filters Directive
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
|
||||||
BacklogFiltersDirective = ($log, $location, $templates) ->
|
BacklogFiltersDirective = ($q, $log, $location, $templates) ->
|
||||||
template = $templates.get("backlog/filters.html", true)
|
template = $templates.get("backlog/filters.html", true)
|
||||||
templateSelected = $templates.get("backlog/filter-selected.html", true)
|
templateSelected = $templates.get("backlog/filter-selected.html", true)
|
||||||
|
|
||||||
|
@ -88,6 +88,13 @@ BacklogFiltersDirective = ($log, $location, $templates) ->
|
||||||
getFiltersType = () ->
|
getFiltersType = () ->
|
||||||
return $el.find("h2 a.subfilter span.title").prop('data-type')
|
return $el.find("h2 a.subfilter span.title").prop('data-type')
|
||||||
|
|
||||||
|
reloadUserstories = () ->
|
||||||
|
currentFiltersType = getFiltersType()
|
||||||
|
|
||||||
|
$q.all([$ctrl.loadUserstories(), $ctrl.generateFilters()]).then () ->
|
||||||
|
currentFilters = $scope.filters[currentFiltersType]
|
||||||
|
renderFilters(_.reject(currentFilters, "selected"))
|
||||||
|
|
||||||
toggleFilterSelection = (type, id) ->
|
toggleFilterSelection = (type, id) ->
|
||||||
currentFiltersType = getFiltersType()
|
currentFiltersType = getFiltersType()
|
||||||
|
|
||||||
|
@ -110,22 +117,17 @@ BacklogFiltersDirective = ($log, $location, $templates) ->
|
||||||
if type == currentFiltersType
|
if type == currentFiltersType
|
||||||
renderFilters(_.reject(filters, "selected"))
|
renderFilters(_.reject(filters, "selected"))
|
||||||
|
|
||||||
$ctrl.loadUserstories()
|
reloadUserstories()
|
||||||
.then () ->
|
|
||||||
# reload the tags when a tag is select or unselected
|
|
||||||
# and the filters/tags is open
|
|
||||||
if currentFiltersType == 'tags'
|
|
||||||
$ctrl.generateFilters().then () ->
|
|
||||||
tags = $scope.filters["tags"]
|
|
||||||
renderFilters(_.reject(tags, "selected"))
|
|
||||||
|
|
||||||
selectQFilter = debounceLeading 100, (value) ->
|
selectQFilter = debounceLeading 100, (value) ->
|
||||||
return if value is undefined
|
return if value is undefined
|
||||||
|
|
||||||
if value.length == 0
|
if value.length == 0
|
||||||
$ctrl.replaceFilter("q", null)
|
$ctrl.replaceFilter("q", null)
|
||||||
else
|
else
|
||||||
$ctrl.replaceFilter("q", value)
|
$ctrl.replaceFilter("q", value)
|
||||||
$ctrl.loadUserstories()
|
|
||||||
|
reloadUserstories()
|
||||||
|
|
||||||
$scope.$watch("filtersQ", selectQFilter)
|
$scope.$watch("filtersQ", selectQFilter)
|
||||||
|
|
||||||
|
@ -174,4 +176,4 @@ BacklogFiltersDirective = ($log, $location, $templates) ->
|
||||||
|
|
||||||
return {link:link}
|
return {link:link}
|
||||||
|
|
||||||
module.directive("tgBacklogFilters", ["$log", "$tgLocation", "$tgTemplate", BacklogFiltersDirective])
|
module.directive("tgBacklogFilters", ["$q", "$log", "$tgLocation", "$tgTemplate", BacklogFiltersDirective])
|
||||||
|
|
|
@ -149,10 +149,6 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
|
||||||
|
|
||||||
return stats
|
return stats
|
||||||
|
|
||||||
refreshTagsColors: ->
|
|
||||||
return @rs.projects.tagsColors(@scope.projectId).then (tags_colors) =>
|
|
||||||
@scope.project.tags_colors = tags_colors
|
|
||||||
|
|
||||||
unloadClosedSprints: ->
|
unloadClosedSprints: ->
|
||||||
@scope.$apply =>
|
@scope.$apply =>
|
||||||
@scope.closedSprints = []
|
@scope.closedSprints = []
|
||||||
|
@ -205,10 +201,9 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
|
||||||
@scope.httpParams = @.getUrlFilters()
|
@scope.httpParams = @.getUrlFilters()
|
||||||
@rs.userstories.storeQueryParams(@scope.projectId, @scope.httpParams)
|
@rs.userstories.storeQueryParams(@scope.projectId, @scope.httpParams)
|
||||||
|
|
||||||
promise = @q.all([@.refreshTagsColors(), @rs.userstories.listUnassigned(@scope.projectId, @scope.httpParams)])
|
promise = @rs.userstories.listUnassigned(@scope.projectId, @scope.httpParams)
|
||||||
|
|
||||||
return promise.then (data) =>
|
return promise.then (userstories) =>
|
||||||
userstories = data[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 = _.sortBy(userstories, "backlog_order")
|
||||||
|
|
||||||
|
@ -433,26 +428,21 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
|
||||||
loadFilters = {}
|
loadFilters = {}
|
||||||
loadFilters.project = @scope.projectId
|
loadFilters.project = @scope.projectId
|
||||||
loadFilters.tags = urlfilters.tags
|
loadFilters.tags = urlfilters.tags
|
||||||
|
loadFilters.status = urlfilters.status
|
||||||
|
loadFilters.q = urlfilters.q
|
||||||
|
loadFilters.milestone = 'null'
|
||||||
|
|
||||||
return @rs.userstories.filtersData(loadFilters).then (data) =>
|
return @rs.userstories.filtersData(loadFilters).then (data) =>
|
||||||
choicesFiltersFormat = (choices, type, byIdObject) =>
|
choicesFiltersFormat = (choices, type, byIdObject) =>
|
||||||
_.map choices, (t) ->
|
_.map choices, (t) ->
|
||||||
return {
|
t.type = type
|
||||||
id: t[0],
|
return t
|
||||||
name: byIdObject[t[0]].name,
|
|
||||||
color: byIdObject[t[0]].color,
|
|
||||||
count: t[1],
|
|
||||||
type: type}
|
|
||||||
|
|
||||||
tagsFilterFormat = (tags) =>
|
tagsFilterFormat = (tags) =>
|
||||||
return _.map tags, (t) =>
|
return _.map tags, (t) ->
|
||||||
return {
|
t.id = t.name
|
||||||
id: t[0],
|
t.type = 'tags'
|
||||||
name: t[0],
|
return t
|
||||||
color: @scope.project.tags_colors[t[0]],
|
|
||||||
count: t[1],
|
|
||||||
type: "tags"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Build filters data structure
|
# Build filters data structure
|
||||||
@scope.filters.status = choicesFiltersFormat(data.statuses, "status", @scope.usStatusById)
|
@scope.filters.status = choicesFiltersFormat(data.statuses, "status", @scope.usStatusById)
|
||||||
|
|
|
@ -182,6 +182,13 @@ class IssuesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi
|
||||||
loadFilters = {}
|
loadFilters = {}
|
||||||
loadFilters.project = @scope.projectId
|
loadFilters.project = @scope.projectId
|
||||||
loadFilters.tags = urlfilters.tags
|
loadFilters.tags = urlfilters.tags
|
||||||
|
loadFilters.status = urlfilters.status
|
||||||
|
loadFilters.q = urlfilters.q
|
||||||
|
loadFilters.types = urlfilters.types
|
||||||
|
loadFilters.severities = urlfilters.severities
|
||||||
|
loadFilters.priorities = urlfilters.priorities
|
||||||
|
loadFilters.assigned_to = urlfilters.assignedTo
|
||||||
|
loadFilters.owner = urlfilters.createdBy
|
||||||
|
|
||||||
# Load default filters data
|
# Load default filters data
|
||||||
promise = promise.then =>
|
promise = promise.then =>
|
||||||
|
@ -191,12 +198,11 @@ class IssuesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi
|
||||||
return promise.then (data) =>
|
return promise.then (data) =>
|
||||||
usersFiltersFormat = (users, type, unknownOption) =>
|
usersFiltersFormat = (users, type, unknownOption) =>
|
||||||
reformatedUsers = _.map users, (t) =>
|
reformatedUsers = _.map users, (t) =>
|
||||||
return {
|
t.type = type
|
||||||
id: t[0],
|
t.name = if t.full_name then t.full_name else unknownOption
|
||||||
count: t[1],
|
|
||||||
type: type
|
return t
|
||||||
name: if t[0] then @scope.usersById[t[0]].full_name_display else unknownOption
|
|
||||||
}
|
|
||||||
unknownItem = _.remove(reformatedUsers, (u) -> not u.id)
|
unknownItem = _.remove(reformatedUsers, (u) -> not u.id)
|
||||||
reformatedUsers = _.sortBy(reformatedUsers, (u) -> u.name.toUpperCase())
|
reformatedUsers = _.sortBy(reformatedUsers, (u) -> u.name.toUpperCase())
|
||||||
if unknownItem.length > 0
|
if unknownItem.length > 0
|
||||||
|
@ -205,22 +211,14 @@ class IssuesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi
|
||||||
|
|
||||||
choicesFiltersFormat = (choices, type, byIdObject) =>
|
choicesFiltersFormat = (choices, type, byIdObject) =>
|
||||||
_.map choices, (t) ->
|
_.map choices, (t) ->
|
||||||
return {
|
t.type = type
|
||||||
id: t[0],
|
return t
|
||||||
name: byIdObject[t[0]].name,
|
|
||||||
color: byIdObject[t[0]].color,
|
|
||||||
count: t[1],
|
|
||||||
type: type}
|
|
||||||
|
|
||||||
tagsFilterFormat = (tags) =>
|
tagsFilterFormat = (tags) =>
|
||||||
return _.map tags, (t) =>
|
return _.map tags, (t) ->
|
||||||
return {
|
t.id = t.name
|
||||||
id: t[0],
|
t.type = 'tags'
|
||||||
name: t[0],
|
return t
|
||||||
color: @scope.project.tags_colors[t[0]],
|
|
||||||
count: t[1],
|
|
||||||
type: "tags"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Build filters data structure
|
# Build filters data structure
|
||||||
@scope.filters.status = choicesFiltersFormat(data.statuses, "status", @scope.issueStatusById)
|
@scope.filters.status = choicesFiltersFormat(data.statuses, "status", @scope.issueStatusById)
|
||||||
|
@ -448,7 +446,7 @@ module.directive("tgIssues", ["$log", "$tgLocation", "$tgTemplate", "$compile",
|
||||||
## Issues Filters Directive
|
## Issues Filters Directive
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
|
||||||
IssuesFiltersDirective = ($log, $location, $rs, $confirm, $loading, $template, $translate, $compile, $auth) ->
|
IssuesFiltersDirective = ($q, $log, $location, $rs, $confirm, $loading, $template, $translate, $compile, $auth) ->
|
||||||
template = $template.get("issue/issues-filters.html", true)
|
template = $template.get("issue/issues-filters.html", true)
|
||||||
templateSelected = $template.get("issue/issues-filters-selected.html", true)
|
templateSelected = $template.get("issue/issues-filters-selected.html", true)
|
||||||
|
|
||||||
|
@ -500,6 +498,16 @@ IssuesFiltersDirective = ($log, $location, $rs, $confirm, $loading, $template, $
|
||||||
html = $compile(html)($scope)
|
html = $compile(html)($scope)
|
||||||
$el.find(".filter-list").html(html)
|
$el.find(".filter-list").html(html)
|
||||||
|
|
||||||
|
getFiltersType = () ->
|
||||||
|
return $el.find("h2 a.subfilter span.title").prop('data-type')
|
||||||
|
|
||||||
|
reloadIssues = () ->
|
||||||
|
currentFiltersType = getFiltersType()
|
||||||
|
|
||||||
|
$q.all([$ctrl.loadIssues(), $ctrl.loadFilters()]).then () ->
|
||||||
|
filters = $scope.filters[currentFiltersType]
|
||||||
|
renderFilters(_.reject(filters, "selected"))
|
||||||
|
|
||||||
toggleFilterSelection = (type, id) ->
|
toggleFilterSelection = (type, id) ->
|
||||||
if type == "myFilters"
|
if type == "myFilters"
|
||||||
$rs.issues.getMyFilters($scope.projectId).then (data) ->
|
$rs.issues.getMyFilters($scope.projectId).then (data) ->
|
||||||
|
@ -535,20 +543,12 @@ IssuesFiltersDirective = ($log, $location, $rs, $confirm, $loading, $template, $
|
||||||
$ctrl.selectFilter("page", 1)
|
$ctrl.selectFilter("page", 1)
|
||||||
$ctrl.storeFilters()
|
$ctrl.storeFilters()
|
||||||
|
|
||||||
$ctrl.loadIssues()
|
reloadIssues()
|
||||||
.then () ->
|
|
||||||
# reload the tags when a tag is select or unselected
|
|
||||||
# and the filters/tags is open
|
|
||||||
if filter.type == 'tags'
|
|
||||||
$ctrl.loadFilters().then () ->
|
|
||||||
# re-render the tags if the tags filter is open
|
|
||||||
if currentFiltersType == 'tags'
|
|
||||||
tags = $scope.filters[filter.type]
|
|
||||||
renderFilters(_.reject(tags, "selected"))
|
|
||||||
|
|
||||||
renderSelectedFilters(selectedFilters)
|
renderSelectedFilters(selectedFilters)
|
||||||
|
|
||||||
currentFiltersType = $el.find("h2 a.subfilter span.title").prop('data-type')
|
currentFiltersType = getFiltersType()
|
||||||
|
|
||||||
if type == currentFiltersType
|
if type == currentFiltersType
|
||||||
renderFilters(_.reject(filters, "selected"))
|
renderFilters(_.reject(filters, "selected"))
|
||||||
|
|
||||||
|
@ -572,7 +572,8 @@ IssuesFiltersDirective = ($log, $location, $rs, $confirm, $loading, $template, $
|
||||||
else
|
else
|
||||||
$ctrl.replaceFilter("q", value)
|
$ctrl.replaceFilter("q", value)
|
||||||
$ctrl.storeFilters()
|
$ctrl.storeFilters()
|
||||||
$ctrl.loadIssues()
|
|
||||||
|
reloadIssues()
|
||||||
|
|
||||||
$scope.$watch("filtersQ", selectQFilter)
|
$scope.$watch("filtersQ", selectQFilter)
|
||||||
|
|
||||||
|
@ -679,7 +680,7 @@ IssuesFiltersDirective = ($log, $location, $rs, $confirm, $loading, $template, $
|
||||||
|
|
||||||
return {link:link}
|
return {link:link}
|
||||||
|
|
||||||
module.directive("tgIssuesFilters", ["$log", "$tgLocation", "$tgResources", "$tgConfirm", "$tgLoading",
|
module.directive("tgIssuesFilters", ["$q", "$log", "$tgLocation", "$tgResources", "$tgConfirm", "$tgLoading",
|
||||||
"$tgTemplate", "$translate", "$compile", "$tgAuth", IssuesFiltersDirective])
|
"$tgTemplate", "$translate", "$compile", "$tgAuth", IssuesFiltersDirective])
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,15 @@
|
||||||
a.single-filter.active(data-type!="<%- f.type %>", data-id!="<%- f.id %>")
|
a.single-filter.active(data-type!="<%- f.type %>", data-id!="<%- f.id %>")
|
||||||
span.name(style!="<%- f.style %>")
|
span.name(style!="<%- f.style %>")
|
||||||
| <%- f.name %>
|
| <%- f.name %>
|
||||||
|
<% if (f.count){ %>
|
||||||
span.number <%- f.count %>
|
span.number <%- f.count %>
|
||||||
|
<% } %>
|
||||||
<% } else { %>
|
<% } else { %>
|
||||||
a.single-filter(data-type!="<%- f.type %>", data-id!="<%- f.id %>")
|
a.single-filter(data-type!="<%- f.type %>", data-id!="<%- f.id %>")
|
||||||
span.name(style!="<%- f.style %>")
|
span.name(style!="<%- f.style %>")
|
||||||
| <%- f.name %>
|
| <%- f.name %>
|
||||||
|
<% if (f.count){ %>
|
||||||
span.number <%- f.count %>
|
span.number <%- f.count %>
|
||||||
|
<% } %>
|
||||||
<% } %>
|
<% } %>
|
||||||
<% }) %>
|
<% }) %>
|
Loading…
Reference in New Issue