Improve resource loading on issues list.

stable
Andrey Antukh 2014-09-04 12:42:26 +02:00
parent a8f753af55
commit e6ed0caee0
1 changed files with 65 additions and 72 deletions

View File

@ -65,12 +65,17 @@ class IssuesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi
promise = @.loadInitialData() promise = @.loadInitialData()
promise.then () => # On Success
promise.then =>
@appTitle.set("Issues - " + @scope.project.name) @appTitle.set("Issues - " + @scope.project.name)
tgLoader.pageLoaded() tgLoader.pageLoaded()
promise.then null, -> # On Error
console.log "FAIL" #TODO promise.then null, (xhr) =>
if xhr and xhr.status == 404
@location.path("/not-found")
@location.replace()
return @q.reject(xhr)
@scope.$on "issueform:new:success", => @scope.$on "issueform:new:success", =>
@.loadIssues() @.loadIssues()
@ -109,23 +114,14 @@ class IssuesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi
return filters[name] return filters[name]
loadMyFilters: -> loadMyFilters: ->
deferred = @q.defer() return @rs.issues.getMyFilters(@scope.projectId).then (filters) =>
promise = @rs.issues.getMyFilters(@scope.projectId) return _.map filters, (value, key) =>
promise.then (filters) -> return {id: key, name: key, type: "myFilters", selected: false}
result = _.map filters, (value, key) =>
obj = {
id: key,
name: key,
type: "myFilters"
}
obj.selected = false
return obj
deferred.resolve(result)
return deferred.promise
removeNotExistingFiltersFromUrl: -> removeNotExistingFiltersFromUrl: ->
currentSearch = @location.search() currentSearch = @location.search()
urlfilters = @.getUrlFilters() urlfilters = @.getUrlFilters()
for filterName, filterValue of urlfilters for filterName, filterValue of urlfilters
if filterName == "page" or filterName == "orderBy" or filterName == "q" if filterName == "page" or filterName == "orderBy" or filterName == "q"
continue continue
@ -162,64 +158,67 @@ class IssuesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi
obj.selected = if isSelected(obj.type, obj.id) then true else undefined obj.selected = if isSelected(obj.type, obj.id) then true else undefined
loadFilters: -> loadFilters: ->
deferred = @q.defer()
urlfilters = @.getUrlFilters() urlfilters = @.getUrlFilters()
if urlfilters.q if urlfilters.q
@scope.filtersQ = urlfilters.q @scope.filtersQ = urlfilters.q
@.loadMyFilters().then (myFilters) => # Load My Filters
promise = @.loadMyFilters().then (myFilters) =>
@scope.filters.myFilters = myFilters @scope.filters.myFilters = myFilters
@rs.issues.filtersData(@scope.projectId).then (data) => return myFilters
usersFiltersFormat = (users, type, unknownOption) =>
reformatedUsers = _.map users, (t) =>
return {
id: t[0],
count: t[1],
type: type
name: if t[0] then @scope.usersById[t[0]].full_name_display else unknownOption
}
unknownItem = _.remove(reformatedUsers, (u) -> not u.id)
reformatedUsers = _.sortBy(reformatedUsers, (u) -> u.name.toUpperCase())
if unknownItem.length > 0
reformatedUsers.unshift(unknownItem[0])
return reformatedUsers
choicesFiltersFormat = (choices, type, byIdObject) => # Load default filters data
_.map choices, (t) -> promise = promise.then =>
return { return @rs.issues.filtersData(@scope.projectId)
id: t[0],
name: byIdObject[t[0]].name,
color: byIdObject[t[0]].color,
count: t[1],
type: type}
tagsFilterFormat = (tags) => # Format filters and set them on scope
return _.map tags, (t) => return promise.then (data) =>
return { usersFiltersFormat = (users, type, unknownOption) =>
id: t[0], reformatedUsers = _.map users, (t) =>
name: t[0], return {
color: @scope.project.tags_colors[t[0]], id: t[0],
count: t[1], count: t[1],
type: "tags" type: type
} name: if t[0] then @scope.usersById[t[0]].full_name_display else unknownOption
}
unknownItem = _.remove(reformatedUsers, (u) -> not u.id)
reformatedUsers = _.sortBy(reformatedUsers, (u) -> u.name.toUpperCase())
if unknownItem.length > 0
reformatedUsers.unshift(unknownItem[0])
return reformatedUsers
# Build filters data structure choicesFiltersFormat = (choices, type, byIdObject) =>
@scope.filters.statuses = choicesFiltersFormat data.statuses, "statuses", @scope.issueStatusById _.map choices, (t) ->
@scope.filters.severities = choicesFiltersFormat data.severities, "severities", @scope.severityById return {
@scope.filters.priorities = choicesFiltersFormat data.priorities, "priorities", @scope.priorityById id: t[0],
@scope.filters.assignedTo = usersFiltersFormat data.assigned_to, "assignedTo", "Unassigned" name: byIdObject[t[0]].name,
@scope.filters.createdBy = usersFiltersFormat data.created_by, "createdBy", "Unknown" color: byIdObject[t[0]].color,
@scope.filters.types = choicesFiltersFormat data.types, "types", @scope.issueTypeById count: t[1],
@scope.filters.tags = tagsFilterFormat data.tags type: type}
@.removeNotExistingFiltersFromUrl() tagsFilterFormat = (tags) =>
return _.map tags, (t) =>
return {
id: t[0],
name: t[0],
color: @scope.project.tags_colors[t[0]],
count: t[1],
type: "tags"
}
@.markSelectedFilters(@scope.filters, urlfilters) # Build filters data structure
@scope.filters.statuses = choicesFiltersFormat(data.statuses, "statuses", @scope.issueStatusById)
@scope.filters.severities = choicesFiltersFormat(data.severities, "severities", @scope.severityById)
@scope.filters.priorities = choicesFiltersFormat(data.priorities, "priorities", @scope.priorityById)
@scope.filters.assignedTo = usersFiltersFormat(data.assigned_to, "assignedTo", "Unassigned")
@scope.filters.createdBy = usersFiltersFormat(data.created_by, "createdBy", "Unknown")
@scope.filters.types = choicesFiltersFormat(data.types, "types", @scope.issueTypeById)
@scope.filters.tags = tagsFilterFormat(data.tags)
@rootscope.$broadcast("filters:loaded", @scope.filters) @.removeNotExistingFiltersFromUrl()
deferred.resolve() @.markSelectedFilters(@scope.filters, urlfilters)
return deferred.promise @rootscope.$broadcast("filters:loaded", @scope.filters)
loadIssues: -> loadIssues: ->
@scope.urlFilters = @.getUrlFilters() @scope.urlFilters = @.getUrlFilters()
@ -247,28 +246,22 @@ class IssuesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi
name = "type" name = "type"
@scope.httpParams[name] = values @scope.httpParams[name] = values
promise = @rs.issues.list(@scope.projectId, @scope.httpParams).then (data) => return @rs.issues.list(@scope.projectId, @scope.httpParams).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
@scope.paginatedBy = data.paginatedBy @scope.paginatedBy = data.paginatedBy
return data return data
return promise
loadInitialData: -> loadInitialData: ->
promise = @repo.resolve({pslug: @params.pslug}).then (data) => promise = @repo.resolve({pslug: @params.pslug}).then (data) =>
@scope.projectId = data.project @scope.projectId = data.project
return data return data
promise.then null, =>
@location.path("/not-found")
@location.replace()
return promise.then(=> @.loadProject()) return promise.then(=> @.loadProject())
.then(=> @.loadUsersAndRoles()) .then(=> @q.all([@.loadUsersAndRoles(),
.then(=> @.loadFilters()) @.loadFilters(),
.then(=> @.loadIssues()) @.loadIssues()]))
saveCurrentFiltersTo: (newFilter) -> saveCurrentFiltersTo: (newFilter) ->
deferred = @q.defer() deferred = @q.defer()