Add ordering implementation to issues list.

stable
Andrey Antukh 2014-07-10 20:46:44 +02:00
parent 3fb545edf2
commit 18318d4e75
3 changed files with 68 additions and 37 deletions

View File

@ -28,6 +28,7 @@ joinStr = @.taiga.joinStr
groupBy = @.taiga.groupBy groupBy = @.taiga.groupBy
bindOnce = @.taiga.bindOnce bindOnce = @.taiga.bindOnce
debounce = @.taiga.debounce debounce = @.taiga.debounce
startswith = @.taiga.startswith
module = angular.module("taigaIssues") module = angular.module("taigaIssues")
@ -77,22 +78,32 @@ class IssuesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi
return project return project
getUrlFilters: -> getUrlFilters: ->
filters = _.pick(@location.search(), "page", "tags", "statuses", "types", "subject", filters = _.pick(@location.search(), "page", "tags", "statuses", "types",
"severities", "priorities", "assignedTo") "subject", "severities", "priorities",
"assignedTo", "orderBy")
filters.page = 1 if not filters.page filters.page = 1 if not filters.page
return filters return filters
loadFilters: -> getUrlFilter: (name) ->
return @rs.issues.filtersData(@scope.projectId).then (data) => filters = _.pick(@location.search(), name)
urlfilters = @.getUrlFilters() return filters[name]
loadFilters: ->
# This function is executed only once when page is loads and
# it needs create all filters structure and know that
# filters are selected from url params.
urlfilters = @.getUrlFilters()
if urlfilters.subject
@scope.filtersSubject = urlfilters.subject
return @rs.issues.filtersData(@scope.projectId).then (data) =>
# Build selected filters (from url) fast lookup data structure # Build selected filters (from url) fast lookup data structure
searchdata = {} searchdata = {}
for name, value of urlfilters for name, value of _.omit(urlfilters, "page", "orderBy")
if name == "page" # if name == "page" or name == "orderBy"
continue # continue
if not searchdata[name]? if not searchdata[name]?
searchdata[name] = {} searchdata[name] = {}
@ -135,38 +146,33 @@ class IssuesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi
obj.selected = true if isSelected("statuses", obj.id) obj.selected = true if isSelected("statuses", obj.id)
return obj return obj
if urlfilters.subject
@scope.filtersSubject = urlfilters.subject
@rootscope.$broadcast("filters:loaded", @scope.filters) @rootscope.$broadcast("filters:loaded", @scope.filters)
return data return data
# Convert stored filters to http parameters loadIssues: ->
# ready filters (the name difference exists @scope.urlFilters = @.getUrlFilters()
# because of some automatic lookups and is
# the simplest way todo it without adding
# additional complexity to code.
prepareFilters: ->
filters = {}
for name, values of @.getUrlFilters() # Convert stored filters to http parameters
# ready filters (the name difference exists
# because of some automatic lookups and is
# the simplest way todo it without adding
# additional complexity to code.
@scope.httpParams = {}
for name, values of @scope.urlFilters
if name == "severities" if name == "severities"
name = "severity" name = "severity"
else if name == "orderBy"
name = "order_by"
else if name == "priorities" else if name == "priorities"
name = "priority" name = "priority"
else if name == "assignedTo" else if name == "assignedTo"
name = "assigned_to" name = "assigned_to"
else if name == "statuses" else if name == "statuses"
name = "status" name = "status"
@scope.httpParams[name] = values
filters[name] = values console.log "prepared filters", @scope.httpParams
promise = @rs.issues.list(@scope.projectId, @scope.httpParams).then (data) =>
return filters
loadIssues: ->
filters = @.prepareFilters()
promise = @rs.issues.list(@scope.projectId, filters).then (data) =>
@scope.issues = data.models @scope.issues = data.models
@scope.page = data.current @scope.page = data.current
@scope.count = data.count @scope.count = data.count
@ -319,9 +325,28 @@ IssuesDirective = ($log, $location) ->
## Issues Filters ## Issues Filters
######################### #########################
linkFilters = ($scope, $el, $attrs, $ctrl) -> linkOrdering = ($scope, $el, $attrs, $ctrl) ->
$scope.filters = {} $el.on "click", ".row.title > div", (event) ->
$scope.selectedFilters = [] target = angular.element(event.currentTarget)
currentOrder = $ctrl.getUrlFilter("orderBy")
newOrder = target.data("fieldname")
finalOrder = newOrder
if currentOrder is undefined
finalOrder = newOrder
else
reverse = true
if startswith(currentOrder, "-")
reverse = false
currentOrder = trim(currentOrder, "-")
if currentOrder == newOrder
finalOrder = if reverse then "-#{newOrder}" else newOrder
$scope.$apply ->
$ctrl.replaceFilter("orderBy", finalOrder)
$ctrl.loadIssues()
######################### #########################
## Issues Link ## Issues Link
@ -329,9 +354,12 @@ IssuesDirective = ($log, $location) ->
link = ($scope, $el, $attrs) -> link = ($scope, $el, $attrs) ->
$ctrl = $el.controller() $ctrl = $el.controller()
linkFilters($scope, $el, $attrs, $ctrl) linkOrdering($scope, $el, $attrs, $ctrl)
linkPagination($scope, $el, $attrs, $ctrl) linkPagination($scope, $el, $attrs, $ctrl)
$scope.$on "$destroy", ->
$el.off()
return {link:link} return {link:link}
############################################################################# #############################################################################

View File

@ -92,6 +92,8 @@ joinStr = (str, coll) ->
debounce = (wait, func) -> debounce = (wait, func) ->
return _.debounce(func, wait) return _.debounce(func, wait)
startswith = (str1, str2) ->
return _.str.startsWith(str1, str2)
taiga = @.taiga taiga = @.taiga
taiga.bindOnce = bindOnce taiga.bindOnce = bindOnce
@ -105,3 +107,4 @@ taiga.scopeDefer = scopeDefer
taiga.toString = toString taiga.toString = toString
taiga.joinStr = joinStr taiga.joinStr = joinStr
taiga.debounce = debounce taiga.debounce = debounce
taiga.startswith = startswith

View File

@ -1,10 +1,10 @@
section.issues-table.basic-table section.issues-table.basic-table
div.row.title div.row.title
div.level-field Severity div.level-field(data-fieldname="severity") Severity
div.level-field Priority div.level-field(data-fieldname="priority") Priority
div.subject Subject div.subject(data-fieldname="subject") Subject
div.issue-field Status div.issue-field(data-fieldname="status") Status
div.assigned-field Assigned to div.assigned-field(data-fieldname="assigned_to") Assigned to
div.row.table-main(ng-repeat="issue in issues track by issue.id") div.row.table-main(ng-repeat="issue in issues track by issue.id")
div.level-field(tg-listitem-severity="issue") div.level-field(tg-listitem-severity="issue")
div.level-field(tg-listitem-priority="issue") div.level-field(tg-listitem-priority="issue")