Merge
commit
5f801bd424
|
@ -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
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
extends layout
|
||||
|
||||
block head
|
||||
title Taiga Project management web application with scrum in mind!
|
||||
|
||||
block content
|
||||
div.wrapper(tg-project-us-status, ng-controller="ProjectValuesController as ctrl",
|
||||
ng-init="section='admin'")
|
||||
sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
|
||||
include views/modules/admin-menu
|
||||
|
||||
section.main.admin-roles
|
||||
header
|
||||
include views/components/mainTitle
|
||||
|
||||
p.total Notifications By Mail
|
||||
|
||||
include views/modules/user-settings/mail-notifications-table
|
|
@ -1,6 +1,26 @@
|
|||
div.popover.select-color
|
||||
ul
|
||||
- for (var z = 0; z < 21; z++)
|
||||
li.color
|
||||
li.color(style="background: #fce94f")
|
||||
li.color(style="background: #edd400")
|
||||
li.color(style="background: #c4a000")
|
||||
li.color(style="background: #8ae234")
|
||||
li.color(style="background: #73d216")
|
||||
li.color(style="background: #4e9a06")
|
||||
li.color(style="background: #d3d7cf")
|
||||
li.color(style="background: #fcaf3e")
|
||||
li.color(style="background: #f57900")
|
||||
li.color(style="background: #ce5c00")
|
||||
li.color(style="background: #729fcf")
|
||||
li.color(style="background: #3465a4")
|
||||
li.color(style="background: #204a87")
|
||||
li.color(style="background: #888a85")
|
||||
li.color(style="background: #ad7fa8")
|
||||
li.color(style="background: #75507b")
|
||||
li.color(style="background: #5c3566")
|
||||
li.color(style="background: #ef2929")
|
||||
li.color(style="background: #cc0000")
|
||||
li.color(style="background: #a40000")
|
||||
li.color(style="background: #2e3436")
|
||||
|
||||
input(type="text", placeholder="personalized colors", ng-model="status.color")
|
||||
div.selected-color(style="background-color: {{ status.color }}")
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
section.mail-notifications-table
|
||||
div.mail-notifications-table-header
|
||||
div.mail-notifications-table-row
|
||||
div.mail-notifications-table-project
|
||||
span Project
|
||||
div.mail-notifications-table-all
|
||||
span Receive All
|
||||
div.mail-notifications-table-involved
|
||||
span Only Involved
|
||||
div.mail-notifications-table-none
|
||||
span No notifications
|
||||
div.mail-notifications-table-body
|
||||
div.mail-notifications-table-row
|
||||
div.mail-notifications-table-project
|
||||
span Decathlon
|
||||
div.mail-notifications-table-all
|
||||
fieldset
|
||||
input(type="radio", name="mail-notifications", id="notifications-all")
|
||||
label(for="notifications-all") All
|
||||
div.mail-notifications-table-involved
|
||||
fieldset
|
||||
input(type="radio", name="mail-notifications", id="notifications-involved")
|
||||
label(for="notifications-involved") Involved
|
||||
div.mail-notifications-table-none
|
||||
fieldset
|
||||
input(type="radio", name="mail-notifications", id="notifications-none")
|
||||
label(for="notifications-none") None
|
|
@ -74,6 +74,9 @@ $prefix-for-spec: true;
|
|||
@import 'modules/admin/default-values';
|
||||
@import 'modules/admin/project-values';
|
||||
|
||||
//Modules user Settings
|
||||
@import 'modules/user-settings/mail-notifications-table';
|
||||
|
||||
//Layout
|
||||
@import 'layout/base';
|
||||
@import 'layout/login';
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
.mail-notifications-table {
|
||||
.mail-notifications-table-row {
|
||||
@include table-flex(stretch, center, flex, row, wrap, center);
|
||||
border-bottom: 1px solid $whitish;
|
||||
}
|
||||
|
||||
.mail-notifications-table-header {
|
||||
@extend %bold;
|
||||
border-bottom: 2px solid $gray-light;
|
||||
}
|
||||
|
||||
.mail-notifications-table-project ,
|
||||
.mail-notifications-table-all,
|
||||
.mail-notifications-table-involved,
|
||||
.mail-notifications-table-none {
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.mail-notifications-table-project {
|
||||
@include table-flex-child(3, 0, 0);
|
||||
}
|
||||
|
||||
.mail-notifications-table-all,
|
||||
.mail-notifications-table-involved,
|
||||
.mail-notifications-table-none {
|
||||
@include table-flex-child(1, 0, 0);
|
||||
}
|
||||
input {
|
||||
display: none;
|
||||
&:checked {
|
||||
+label {
|
||||
@include transition(background .3s linear);
|
||||
background: $green-taiga;
|
||||
}
|
||||
}
|
||||
}
|
||||
label {
|
||||
background: $gray-light;
|
||||
border-radius: 5px;
|
||||
color: $white;
|
||||
display: block;
|
||||
padding: .5rem;
|
||||
&:hover {
|
||||
@include transition(background .3s linear);
|
||||
background: $fresh-taiga;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue