Merge pull request #547 from taigaio/us/2911/mixin_users_with_memberships_in_project_detail_serializer

US #2911: Mixin 'users', 'members' and 'memberships' in ProjectDetailSerializer
stable
Alejandro 2015-06-24 01:31:05 -07:00
commit 830b46c36f
15 changed files with 37 additions and 52 deletions

View File

@ -243,7 +243,7 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
loadInitialData: -> loadInitialData: ->
promise = @.loadProject() promise = @.loadProject()
promise.then (project) => promise.then (project) =>
@.fillUsersAndRoles(project.users, project.roles) @.fillUsersAndRoles(project.members, project.roles)
@.initializeSubscription() @.initializeSubscription()
return promise.then(=> @.loadBacklog()) return promise.then(=> @.loadBacklog())

View File

@ -663,14 +663,14 @@ ListItemAssignedtoDirective = ($template) ->
template = $template.get("common/components/list-item-assigned-to-avatar.html", true) template = $template.get("common/components/list-item-assigned-to-avatar.html", true)
link = ($scope, $el, $attrs) -> link = ($scope, $el, $attrs) ->
bindOnce $scope, "membersById", (membersById) -> bindOnce $scope, "usersById", (usersById) ->
item = $scope.$eval($attrs.tgListitemAssignedto) item = $scope.$eval($attrs.tgListitemAssignedto)
ctx = {name: "Unassigned", imgurl: "/images/unnamed.png"} ctx = {name: "Unassigned", imgurl: "/images/unnamed.png"}
member = membersById[item.assigned_to] member = usersById[item.assigned_to]
if member if member
ctx.imgurl = member.photo ctx.imgurl = member.photo
ctx.name = member.full_name ctx.name = member.full_name_display
$el.html(template(ctx)) $el.html(template(ctx))

View File

@ -41,9 +41,9 @@ class PageMixin
@scope.usersById = groupBy(@scope.users, (e) -> e.id) @scope.usersById = groupBy(@scope.users, (e) -> e.id)
@scope.roles = _.sortBy(roles, "order") @scope.roles = _.sortBy(roles, "order")
availableRoles = _(@scope.project.memberships).map("role").uniq().value() computableRoles = _(@scope.project.members).map("role").uniq().value()
@scope.computableRoles = _(roles).filter("computable") @scope.computableRoles = _(roles).filter("computable")
.filter((x) -> _.contains(availableRoles, x.id)) .filter((x) -> _.contains(computableRoles, x.id))
.value() .value()
loadUsersAndRoles: -> loadUsersAndRoles: ->
promise = @q.all([ promise = @q.all([

View File

@ -120,7 +120,6 @@ class IssueDetailController extends mixOf(taiga.Controller, taiga.PageMixin)
@scope.severityById = groupBy(project.severities, (x) -> x.id) @scope.severityById = groupBy(project.severities, (x) -> x.id)
@scope.priorityList = project.priorities @scope.priorityList = project.priorities
@scope.priorityById = groupBy(project.priorities, (x) -> x.id) @scope.priorityById = groupBy(project.priorities, (x) -> x.id)
@scope.membersById = groupBy(project.memberships, (x) -> x.user)
return project return project
loadIssue: -> loadIssue: ->
@ -146,7 +145,7 @@ class IssueDetailController extends mixOf(taiga.Controller, taiga.PageMixin)
loadInitialData: -> loadInitialData: ->
promise = @.loadProject() promise = @.loadProject()
return promise.then (project) => return promise.then (project) =>
@.fillUsersAndRoles(project.users, project.roles) @.fillUsersAndRoles(project.members, project.roles)
@.loadIssue() @.loadIssue()

View File

@ -112,7 +112,6 @@ class IssuesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi
@scope.issueTypes = _.sortBy(project.issue_types, "order") @scope.issueTypes = _.sortBy(project.issue_types, "order")
@scope.issueTypeById = groupBy(project.issue_types, (x) -> x.id) @scope.issueTypeById = groupBy(project.issue_types, (x) -> x.id)
@scope.membersById = groupBy(project.memberships, (x) -> x.user)
return project return project
getUrlFilters: -> getUrlFilters: ->
@ -278,7 +277,7 @@ class IssuesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi
loadInitialData: -> loadInitialData: ->
promise = @.loadProject() promise = @.loadProject()
return promise.then (project) => return promise.then (project) =>
@.fillUsersAndRoles(project.users, project.roles) @.fillUsersAndRoles(project.members, project.roles)
@.initializeSubscription() @.initializeSubscription()
return @q.all([@.loadFilters(), @.loadIssues()]) return @q.all([@.loadFilters(), @.loadIssues()])

View File

@ -209,7 +209,7 @@ class KanbanController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi
loadInitialData: -> loadInitialData: ->
promise = @.loadProject() promise = @.loadProject()
return promise.then (project) => return promise.then (project) =>
@.fillUsersAndRoles(project.users, project.roles) @.fillUsersAndRoles(project.members, project.roles)
@.initializeSubscription() @.initializeSubscription()
@.loadKanban().then( => @scope.$broadcast("redraw:wip")) @.loadKanban().then( => @scope.$broadcast("redraw:wip"))

View File

@ -84,7 +84,6 @@ class SearchController extends mixOf(taiga.Controller, taiga.PageMixin)
@scope.taskStatusById = groupBy(project.task_statuses, (x) -> x.id) @scope.taskStatusById = groupBy(project.task_statuses, (x) -> x.id)
@scope.severityById = groupBy(project.severities, (x) -> x.id) @scope.severityById = groupBy(project.severities, (x) -> x.id)
@scope.priorityById = groupBy(project.priorities, (x) -> x.id) @scope.priorityById = groupBy(project.priorities, (x) -> x.id)
@scope.membersById = groupBy(project.memberships, (x) -> x.user)
@scope.usStatusById = groupBy(project.us_statuses, (x) -> x.id) @scope.usStatusById = groupBy(project.us_statuses, (x) -> x.id)
return project return project
@ -98,7 +97,7 @@ class SearchController extends mixOf(taiga.Controller, taiga.PageMixin)
loadInitialData: -> loadInitialData: ->
return @.loadProject().then (project) => return @.loadProject().then (project) =>
@scope.projectId = project.id @scope.projectId = project.id
@.fillUsersAndRoles(project.users, project.roles) @.fillUsersAndRoles(project.members, project.roles)
module.controller("SearchController", SearchController) module.controller("SearchController", SearchController)

View File

@ -135,7 +135,7 @@ class TaskboardController extends mixOf(taiga.Controller, taiga.PageMixin)
@scope.$emit('project:loaded', project) @scope.$emit('project:loaded', project)
@.fillUsersAndRoles(project.users, project.roles) @.fillUsersAndRoles(project.members, project.roles)
return project return project

View File

@ -107,7 +107,6 @@ class TaskDetailController extends mixOf(taiga.Controller, taiga.PageMixin)
@scope.$emit('project:loaded', project) @scope.$emit('project:loaded', project)
@scope.statusList = project.task_statuses @scope.statusList = project.task_statuses
@scope.statusById = groupBy(project.task_statuses, (x) -> x.id) @scope.statusById = groupBy(project.task_statuses, (x) -> x.id)
@scope.membersById = groupBy(project.memberships, (x) -> x.user)
return project return project
loadTask: -> loadTask: ->
@ -146,7 +145,7 @@ class TaskDetailController extends mixOf(taiga.Controller, taiga.PageMixin)
loadInitialData: -> loadInitialData: ->
promise = @.loadProject() promise = @.loadProject()
return promise.then (project) => return promise.then (project) =>
@.fillUsersAndRoles(project.users, project.roles) @.fillUsersAndRoles(project.members, project.roles)
@.loadTask().then(=> @q.all([@.loadSprint(), @.loadUserStory()])) @.loadTask().then(=> @q.all([@.loadSprint(), @.loadUserStory()]))
module.controller("TaskDetailController", TaskDetailController) module.controller("TaskDetailController", TaskDetailController)

View File

@ -70,30 +70,18 @@ class TeamController extends mixOf(taiga.Controller, taiga.PageMixin)
@scope.filtersRole = null @scope.filtersRole = null
loadMembers: -> loadMembers: ->
currentUser = @auth.getUser() user = @auth.getUser()
if currentUser? and not currentUser.photo?
currentUser.photo = "/images/unnamed.png"
memberships = @projectService.project.toJS().memberships
@scope.currentUser = _.find memberships, (membership) =>
return currentUser? and membership.user == currentUser.id
# Calculate totals
@scope.totals = {} @scope.totals = {}
for member in @scope.activeUsers
@scope.totals[member.id] = 0
_.forEach memberships, (membership) => # Get current user
@scope.totals[membership.user] = 0 @scope.currentUser = _.find(@scope.activeUsers, {id: user?.id})
@scope.memberships = _.filter memberships, (membership) => # Get member list without current user
if membership.user && (not currentUser? or membership.user != currentUser.id) @scope.memberships = _.reject(@scope.activeUsers, {id: user?.id})
return membership
@scope.memberships = _.filter memberships, (membership) => return membership.is_active
for membership in @scope.memberships
if not membership.photo?
membership.photo = "/images/unnamed.png"
loadProject: -> loadProject: ->
return @rs.projects.getBySlug(@params.pslug).then (project) => return @rs.projects.getBySlug(@params.pslug).then (project) =>
@ -115,10 +103,10 @@ class TeamController extends mixOf(taiga.Controller, taiga.PageMixin)
total = _.reduce(vals, (sum, el) -> sum + el) total = _.reduce(vals, (sum, el) -> sum + el)
@scope.totals[userId] = total @scope.totals[userId] = total
@scope.stats = @.processStats(stats) @scope.stats = @._processStats(stats)
@scope.stats.totals = @scope.totals @scope.stats.totals = @scope.totals
processStat: (stat) -> _processStat: (stat) ->
max = _.max(stat) max = _.max(stat)
min = _.min(stat) min = _.min(stat)
singleStat = _.map stat, (value, key) -> singleStat = _.map stat, (value, key) ->
@ -130,17 +118,16 @@ class TeamController extends mixOf(taiga.Controller, taiga.PageMixin)
singleStat = _.object(singleStat) singleStat = _.object(singleStat)
return singleStat return singleStat
processStats: (stats) -> _processStats: (stats) ->
for key,value of stats for key,value of stats
stats[key] = @.processStat(value) stats[key] = @._processStat(value)
return stats return stats
loadInitialData: -> loadInitialData: ->
promise = @.loadProject() promise = @.loadProject()
return promise.then (project) => return promise.then (project) =>
@.fillUsersAndRoles(project.users, project.roles) @.fillUsersAndRoles(project.members, project.roles)
@.loadMembers() @.loadMembers()
return @.loadMemberStats() return @.loadMemberStats()
module.controller("TeamController", TeamController) module.controller("TeamController", TeamController)

View File

@ -123,7 +123,6 @@ class UserStoryDetailController extends mixOf(taiga.Controller, taiga.PageMixin)
@scope.statusList = project.us_statuses @scope.statusList = project.us_statuses
@scope.statusById = groupBy(project.us_statuses, (x) -> x.id) @scope.statusById = groupBy(project.us_statuses, (x) -> x.id)
@scope.taskStatusById = groupBy(project.task_statuses, (x) -> x.id) @scope.taskStatusById = groupBy(project.task_statuses, (x) -> x.id)
@scope.membersById = groupBy(project.memberships, (x) -> x.user)
@scope.pointsList = _.sortBy(project.points, "order") @scope.pointsList = _.sortBy(project.points, "order")
@scope.pointsById = groupBy(@scope.pointsList, (e) -> e.id) @scope.pointsById = groupBy(@scope.pointsList, (e) -> e.id)
return project return project
@ -188,7 +187,7 @@ class UserStoryDetailController extends mixOf(taiga.Controller, taiga.PageMixin)
loadInitialData: -> loadInitialData: ->
promise = @.loadProject() promise = @.loadProject()
return promise.then (project) => return promise.then (project) =>
@.fillUsersAndRoles(project.users, project.roles) @.fillUsersAndRoles(project.members, project.roles)
@.loadUs().then(=> @q.all([@.loadSprint(), @.loadTasks()])) @.loadUs().then(=> @q.all([@.loadSprint(), @.loadTasks()]))
module.controller("UserStoryDetailController", UserStoryDetailController) module.controller("UserStoryDetailController", UserStoryDetailController)

View File

@ -86,7 +86,6 @@ class WikiDetailController extends mixOf(taiga.Controller, taiga.PageMixin)
@scope.projectId = project.id @scope.projectId = project.id
@scope.project = project @scope.project = project
@scope.$emit('project:loaded', project) @scope.$emit('project:loaded', project)
@scope.membersById = groupBy(project.memberships, (x) -> x.user)
return project return project
loadWiki: -> loadWiki: ->
@ -117,7 +116,7 @@ class WikiDetailController extends mixOf(taiga.Controller, taiga.PageMixin)
loadInitialData: -> loadInitialData: ->
promise = @.loadProject() promise = @.loadProject()
return promise.then (project) => return promise.then (project) =>
@.fillUsersAndRoles(project.users, project.roles) @.fillUsersAndRoles(project.members, project.roles)
@q.all([@.loadWikiLinks(), @.loadWiki()]).then () => @q.all([@.loadWikiLinks(), @.loadWiki()]).then () =>

View File

@ -9,7 +9,8 @@ div.wrapper
p.description {{vm.project.get('description')}} p.description {{vm.project.get('description')}}
div.single-project-tags.tags-container(ng-if="::vm.project.get('tags').size") div.single-project-tags.tags-container(ng-if="::vm.project.get('tags').size")
span.tag(style='border-left: 5px solid {{::tag.get("color")}};', tg-repeat="tag in ::vm.project.get('colorized_tags')") span.tag(style='border-left: 5px solid {{::tag.get("color")}};',
tg-repeat="tag in ::vm.project.get('colorized_tags')")
span.tag-name {{::tag.get('name')}} span.tag-name {{::tag.get('name')}}
div.project-data div.project-data
@ -18,7 +19,9 @@ div.wrapper
section.involved-data section.involved-data
h2.title {{"PROJECT.SECTION.TEAM" | translate}} h2.title {{"PROJECT.SECTION.TEAM" | translate}}
ul.involved-team ul.involved-team
a(tg-nav="user-profile:username=member.get('username')", title="{{::member.get('full_name')}}", tg-repeat="member in ::vm.project.get('memberships')") a(tg-repeat="member in ::vm.project.get('members')",
tg-nav="user-profile:username=member.get('username')",
title="{{::member.get('full_name')}}")
img(ng-src="{{::member.get('photo')}}", alt="{{::member.get('full_name')}}") img(ng-src="{{::member.get('photo')}}", alt="{{::member.get('full_name')}}")
// h2.title Organizations // h2.title Organizations

View File

@ -1,10 +1,10 @@
.row .row
.username .username
figure.avatar figure.avatar
img(tg-bo-src="currentUser.photo", tg-bo-alt="currentUser.full_name") img(tg-bo-src="currentUser.photo", tg-bo-alt="currentUser.full_name_display")
figcaption figcaption
span.name(tg-bo-bind="currentUser.full_name") span.name(tg-bo-bind="currentUser.full_name_display")
span.position(tg-bo-bind="currentUser.role_name") span.position(tg-bo-bind="currentUser.role_name")

View File

@ -1,10 +1,11 @@
.row.member(ng-repeat="user in memberships | membersFilter:filtersQ:filtersRole") .row.member(ng-repeat="user in memberships | membersFilter:filtersQ:filtersRole")
.username .username
figure.avatar figure.avatar
img(tg-bo-src="user.photo", tg-bo-alt="user.full_name") img(tg-bo-src="user.photo", tg-bo-alt="user.full_name_display")
figcaption figcaption
a.name(tg-nav="user-profile:username=user.username", title="{{::user.full_name }}") {{::user.full_name}} a.name(tg-nav="user-profile:username=user.username",
title="{{::user.full_name_display}}") {{::user.full_name_display}}
span.position {{::user.role_name}} span.position {{::user.role_name}}
.member-stats(tg-team-member-stats, stats="stats", .member-stats(tg-team-member-stats, stats="stats",