List memberships
parent
38c0fc1e10
commit
06866ff577
|
@ -63,6 +63,8 @@ configure = ($routeProvider, $locationProvider, $httpProvider, $provide) ->
|
|||
$routeProvider.when("/project/:pslug/admin/project-values/us-status",
|
||||
{templateUrl: "/partials/admin-project-values-us-status.html"})
|
||||
|
||||
$routeProvider.when("/project/:pslug/admin/memberships",
|
||||
{templateUrl: "/partials/admin-memberships.html"})
|
||||
# Auth
|
||||
$routeProvider.when("/login", {templateUrl: "/partials/login.html"})
|
||||
$routeProvider.when("/register", {templateUrl: "/partials/register.html"})
|
||||
|
|
|
@ -0,0 +1,157 @@
|
|||
###
|
||||
# Copyright (C) 2014 Andrey Antukh <niwi@niwi.be>
|
||||
# Copyright (C) 2014 Jesús Espino Garcia <jespinog@gmail.com>
|
||||
# Copyright (C) 2014 David Barragán Merino <bameda@dbarragan.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# File: modules/admin/project-profile.coffee
|
||||
###
|
||||
|
||||
taiga = @.taiga
|
||||
|
||||
mixOf = @.taiga.mixOf
|
||||
|
||||
module = angular.module("taigaAdmin")
|
||||
|
||||
|
||||
#############################################################################
|
||||
## Project Memberships Controller
|
||||
#############################################################################
|
||||
|
||||
class MembershipsController extends mixOf(taiga.Controller, taiga.PageMixin)
|
||||
@.$inject = [
|
||||
"$scope",
|
||||
"$rootScope",
|
||||
"$tgRepo",
|
||||
"$tgConfirm",
|
||||
"$tgResources",
|
||||
"$routeParams",
|
||||
"$q",
|
||||
"$location"
|
||||
]
|
||||
|
||||
constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location) ->
|
||||
_.bindAll(@)
|
||||
|
||||
@scope.sectionName = "Memberships"
|
||||
|
||||
promise = @.loadInitialData()
|
||||
promise.then null, ->
|
||||
console.log "FAIL" #TODO
|
||||
|
||||
loadProject: ->
|
||||
return @rs.projects.get(@scope.projectId).then (project) =>
|
||||
@scope.project = project
|
||||
return project
|
||||
|
||||
loadMembers: ->
|
||||
return @rs.memberships.list(@scope.projectId).then (data) =>
|
||||
@scope.memberships = data.models
|
||||
return data
|
||||
|
||||
loadInitialData: ->
|
||||
promise = @repo.resolve({pslug: @params.pslug}).then (data) =>
|
||||
@scope.projectId = data.project
|
||||
return data
|
||||
|
||||
return promise.then(=> @.loadProject())
|
||||
.then(=> @.loadMembers())
|
||||
|
||||
|
||||
module.controller("MembershipsController", MembershipsController)
|
||||
|
||||
|
||||
#############################################################################
|
||||
## Member Avatar Directive
|
||||
#############################################################################
|
||||
|
||||
MembershipsMemberAvatarDirective = ($log) ->
|
||||
template = _.template("""
|
||||
<figure class="avatar">
|
||||
<img src="<%= imgurl %>" alt="<%- full_name %>">
|
||||
<figcaption>
|
||||
<span class="name"><%- full_name %></span>
|
||||
<span class="email"><%- email %></span>
|
||||
</figcaption>
|
||||
</figure>
|
||||
""")
|
||||
|
||||
render = (member) ->
|
||||
ctx = {
|
||||
full_name: if member.full_name then member.full_name else "------"
|
||||
email: member.email
|
||||
imgurl: if member.photo then member.photo else "http://thecodeplayer.com/u/uifaces/12.jpg"
|
||||
}
|
||||
|
||||
return template(ctx)
|
||||
|
||||
link = ($scope, $el, $attrs) ->
|
||||
if not $attrs.tgMembershipsMemberAvatar?
|
||||
return $log.error "MembershipsMemberAvatarDirective: the directive need a member"
|
||||
|
||||
member = $scope.$eval($attrs.tgMembershipsMemberAvatar)
|
||||
html = render(member)
|
||||
$el.html(html)
|
||||
|
||||
return {
|
||||
link: link
|
||||
}
|
||||
|
||||
|
||||
module.directive("tgMembershipsMemberAvatar", ["$log", MembershipsMemberAvatarDirective])
|
||||
|
||||
|
||||
#############################################################################
|
||||
## Member Actions Directive
|
||||
#############################################################################
|
||||
|
||||
MembershipsMemberActionsDirective = ($log) ->
|
||||
activedTemplate = _.template("""
|
||||
<div class="active">
|
||||
Active
|
||||
</div>
|
||||
<a class="delete" href="">
|
||||
<span class="icon icon-delete"></span>
|
||||
</a>
|
||||
""")
|
||||
pendingTemplate = _.template("""
|
||||
<a class="pending" href="">
|
||||
Pending
|
||||
<span class="icon icon-reload"></span>
|
||||
</a>
|
||||
<a class="delete" href="">
|
||||
<span class="icon icon-delete"></span>
|
||||
</a>
|
||||
""")
|
||||
|
||||
render = (member) ->
|
||||
if member.user
|
||||
return activedTemplate()
|
||||
return pendingTemplate()
|
||||
|
||||
link = ($scope, $el, $attrs) ->
|
||||
if not $attrs.tgMembershipsMemberActions?
|
||||
return $log.error "MembershipsMemberActionsDirective: the directive need a member"
|
||||
|
||||
member = $scope.$eval($attrs.tgMembershipsMemberActions)
|
||||
html = render(member)
|
||||
$el.html(html)
|
||||
|
||||
return {
|
||||
link: link
|
||||
}
|
||||
|
||||
|
||||
module.directive("tgMembershipsMemberActions", ["$log", MembershipsMemberActionsDirective])
|
|
@ -51,14 +51,13 @@ urls = {
|
|||
"invitation": "/invitation/:token",
|
||||
|
||||
"profile": "/:user",
|
||||
|
||||
"project": "/project/:project",
|
||||
"project-backlog": "/project/:project/backlog",
|
||||
"project-taskboard": "/project/:project/taskboard/:sprint",
|
||||
"project-kanban": "/project/:project/kanban",
|
||||
"project-issues": "/project/:project/issues",
|
||||
"project-search": "/project/:project/search",
|
||||
"project-issues-detail": "/project/:project/issues/:ref",
|
||||
"project-issues-detail-edit": "/project/:project/issues/:ref/edit",
|
||||
|
||||
"project-userstories-detail": "/project/:project/us/:ref",
|
||||
"project-userstories-detail-edit": "/project/:project/us/:ref/edit",
|
||||
|
@ -66,12 +65,16 @@ urls = {
|
|||
"project-tasks-detail": "/project/:project/tasks/:ref",
|
||||
"project-tasks-detail-edit": "/project/:project/tasks/:ref/edit",
|
||||
|
||||
"project-issues-detail": "/project/:project/issues/:ref",
|
||||
"project-issues-detail-edit": "/project/:project/issues/:ref/edit",
|
||||
|
||||
# Admin
|
||||
"project-admin-home": "/project/:project/admin/project-profile/details",
|
||||
"project-admin-project-profile-details": "/project/:project/admin/project-profile/details",
|
||||
"project-admin-project-profile-default-values": "/project/:project/admin/project-profile/default-values",
|
||||
"project-admin-project-profile-features": "/project/:project/admin/project-profile/features"
|
||||
"project-admin-project-values-us-status": "/project/:project/admin/project-values/us-status"
|
||||
"project-admin-project-profile-features": "/project/:project/admin/project-profile/features",
|
||||
"project-admin-project-values-us-status": "/project/:project/admin/project-values/us-status",
|
||||
"project-admin-memberships": "/project/:project/admin/memberships"
|
||||
}
|
||||
|
||||
init = ($log, $navurls) ->
|
||||
|
|
|
@ -106,6 +106,7 @@ module.run([
|
|||
"$log",
|
||||
"$tgResources",
|
||||
"$tgProjectsResourcesProvider",
|
||||
"$tgMembershipsResourcesProvider",
|
||||
"$tgSprintsResourcesProvider",
|
||||
"$tgUserstoriesResourcesProvider",
|
||||
"$tgTasksResourcesProvider",
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
###
|
||||
# Copyright (C) 2014 Andrey Antukh <niwi@niwi.be>
|
||||
# Copyright (C) 2014 Jesús Espino Garcia <jespinog@gmail.com>
|
||||
# Copyright (C) 2014 David Barragán Merino <bameda@dbarragan.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# File: modules/resources/memberships.coffee
|
||||
###
|
||||
|
||||
|
||||
taiga = @.taiga
|
||||
|
||||
resourceProvider = ($repo) ->
|
||||
service = {}
|
||||
|
||||
service.get = (id) ->
|
||||
return $repo.queryOne("memberships", id)
|
||||
|
||||
service.list = (projectId, filters) ->
|
||||
params = {project: projectId}
|
||||
params = _.extend({}, params, filters or {})
|
||||
return $repo.queryPaginated("memberships", params)
|
||||
|
||||
return (instance) ->
|
||||
instance.memberships = service
|
||||
|
||||
|
||||
module = angular.module("taigaResources")
|
||||
module.factory("$tgMembershipsResourcesProvider", ["$tgRepo", resourceProvider])
|
|
@ -1,18 +1,20 @@
|
|||
extends layout
|
||||
extends dummy-layout
|
||||
|
||||
block head
|
||||
title Taiga Project management web application with scrum in mind!
|
||||
|
||||
block content
|
||||
div.wrapper
|
||||
sidebar.menu-secondary.sidebar
|
||||
div.wrapper(ng-controller="MembershipsController as ctrl",
|
||||
ng-init="section='admin'")
|
||||
sidebar.menu-secondary.sidebar(tg-admin-navigation="memberships")
|
||||
include views/modules/admin-menu
|
||||
|
||||
section.main.admin-membership
|
||||
header
|
||||
include views/components/mainTitle
|
||||
a.button.button-green(title="Add New US" href="")
|
||||
span.text + New role
|
||||
|
||||
a.button.button-green(title="Add new member" href="")
|
||||
span.text + New member
|
||||
|
||||
include views/modules/admin/admin-membership-table
|
||||
|
|
@ -8,15 +8,15 @@ section.admin-menu
|
|||
a(href="", tg-nav="project-admin-project-profile-details:project=project.slug")
|
||||
span.title Project profile
|
||||
span.icon.icon-arrow-right
|
||||
li#adminmenu-project-values
|
||||
a(href="", tg-nav="project-admin-project-values-us-status:project=project.slug")
|
||||
span.title Project values
|
||||
span.icon.icon-arrow-right
|
||||
li#adminmenu-memberships
|
||||
a(href="")
|
||||
a(href="" tg-nav="project-admin-memberships:project=project.slug")
|
||||
span.title Memberships
|
||||
span.icon.icon-arrow-right
|
||||
li#adminmenu-roles
|
||||
a(href="")
|
||||
span.title Roles
|
||||
span.icon.icon-arrow-right
|
||||
li#adminmenu-project-values
|
||||
a(href="", tg-nav="project-admin-project-values-us-status:project=project.slug")
|
||||
span.title Project values
|
||||
span.icon.icon-arrow-right
|
||||
|
|
|
@ -4,44 +4,15 @@ section.admin-membership-table.basic-table
|
|||
div.header-admin Admin
|
||||
div.header-role Role
|
||||
div.header-status Status
|
||||
div.row
|
||||
div.row-member
|
||||
figure.avatar
|
||||
img(alt="username" src="http://thecodeplayer.com/u/uifaces/12.jpg")
|
||||
figcaption
|
||||
span.name Pilar
|
||||
span.email pilar.estaban@secuoyas.com
|
||||
div.row-admin
|
||||
input(type="checkbox", id="is-admin")
|
||||
label(for="is-admin") Is admin?
|
||||
div.row-role
|
||||
select
|
||||
option UX
|
||||
option Front
|
||||
option Back
|
||||
div.row-status
|
||||
div.active Active
|
||||
a(href="#").delete
|
||||
span.icon.icon-delete
|
||||
|
||||
div.row
|
||||
div.row-member
|
||||
figure.avatar
|
||||
img(alt="username" src="http://thecodeplayer.com/u/uifaces/12.jpg")
|
||||
figcaption
|
||||
span.name Pilar
|
||||
span.email pilar.estaban@secuoyas.com
|
||||
div.row(ng-repeat="member in memberships")
|
||||
div.row-member(tg-memberships-member-avatar="member")
|
||||
div.row-admin
|
||||
input(type="checkbox", id="is-admin")
|
||||
input(type="checkbox", id="is-admin" ng-model="member.is_admin")
|
||||
label(for="is-admin") Is admin?
|
||||
div.row-role
|
||||
select
|
||||
select(ng-model="member.role")
|
||||
option UX
|
||||
option Front
|
||||
option Back
|
||||
div.row-status
|
||||
a(href="#").pending
|
||||
| Pending
|
||||
span.icon.icon-reload
|
||||
a(href="#").delete
|
||||
span.icon.icon-delete
|
||||
div.row-status(tg-memberships-member-actions="member")
|
||||
|
|
Loading…
Reference in New Issue