diff --git a/app/coffee/modules/issues/list.coffee b/app/coffee/modules/issues/list.coffee index 0714e526..618b4180 100644 --- a/app/coffee/modules/issues/list.coffee +++ b/app/coffee/modules/issues/list.coffee @@ -28,6 +28,7 @@ joinStr = @.taiga.joinStr groupBy = @.taiga.groupBy bindOnce = @.taiga.bindOnce debounce = @.taiga.debounce +startswith = @.taiga.startswith module = angular.module("taigaIssues") @@ -77,22 +78,32 @@ class IssuesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi return project getUrlFilters: -> - filters = _.pick(@location.search(), "page", "tags", "statuses", "types", "subject", - "severities", "priorities", "assignedTo") + filters = _.pick(@location.search(), "page", "tags", "statuses", "types", + "subject", "severities", "priorities", + "assignedTo", "orderBy") filters.page = 1 if not filters.page return filters - loadFilters: -> - return @rs.issues.filtersData(@scope.projectId).then (data) => - urlfilters = @.getUrlFilters() + getUrlFilter: (name) -> + filters = _.pick(@location.search(), name) + 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 searchdata = {} - for name, value of urlfilters - if name == "page" - continue - + for name, value of _.omit(urlfilters, "page", "orderBy") + # if name == "page" or name == "orderBy" + # continue if not 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) return obj - if urlfilters.subject - @scope.filtersSubject = urlfilters.subject - @rootscope.$broadcast("filters:loaded", @scope.filters) return data - # 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. - prepareFilters: -> - filters = {} + loadIssues: -> + @scope.urlFilters = @.getUrlFilters() - 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" name = "severity" + else if name == "orderBy" + name = "order_by" else if name == "priorities" name = "priority" else if name == "assignedTo" name = "assigned_to" else if name == "statuses" name = "status" + @scope.httpParams[name] = values - filters[name] = values - - return filters - - loadIssues: -> - filters = @.prepareFilters() - - promise = @rs.issues.list(@scope.projectId, filters).then (data) => + console.log "prepared filters", @scope.httpParams + promise = @rs.issues.list(@scope.projectId, @scope.httpParams).then (data) => @scope.issues = data.models @scope.page = data.current @scope.count = data.count @@ -319,9 +325,28 @@ IssuesDirective = ($log, $location) -> ## Issues Filters ######################### - linkFilters = ($scope, $el, $attrs, $ctrl) -> - $scope.filters = {} - $scope.selectedFilters = [] + linkOrdering = ($scope, $el, $attrs, $ctrl) -> + $el.on "click", ".row.title > div", (event) -> + 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 @@ -329,9 +354,12 @@ IssuesDirective = ($log, $location) -> link = ($scope, $el, $attrs) -> $ctrl = $el.controller() - linkFilters($scope, $el, $attrs, $ctrl) + linkOrdering($scope, $el, $attrs, $ctrl) linkPagination($scope, $el, $attrs, $ctrl) + $scope.$on "$destroy", -> + $el.off() + return {link:link} ############################################################################# diff --git a/app/coffee/utils.coffee b/app/coffee/utils.coffee index 386a1593..a5152fa7 100644 --- a/app/coffee/utils.coffee +++ b/app/coffee/utils.coffee @@ -92,6 +92,8 @@ joinStr = (str, coll) -> debounce = (wait, func) -> return _.debounce(func, wait) +startswith = (str1, str2) -> + return _.str.startsWith(str1, str2) taiga = @.taiga taiga.bindOnce = bindOnce @@ -105,3 +107,4 @@ taiga.scopeDefer = scopeDefer taiga.toString = toString taiga.joinStr = joinStr taiga.debounce = debounce +taiga.startswith = startswith diff --git a/app/partials/views/modules/issues-table.jade b/app/partials/views/modules/issues-table.jade index a74c6062..fa00f11b 100644 --- a/app/partials/views/modules/issues-table.jade +++ b/app/partials/views/modules/issues-table.jade @@ -1,10 +1,10 @@ section.issues-table.basic-table div.row.title - div.level-field Severity - div.level-field Priority - div.subject Subject - div.issue-field Status - div.assigned-field Assigned to + div.level-field(data-fieldname="severity") Severity + div.level-field(data-fieldname="priority") Priority + div.subject(data-fieldname="subject") Subject + div.issue-field(data-fieldname="status") Status + div.assigned-field(data-fieldname="assigned_to") Assigned to 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-priority="issue")