Commit 18bd1c9d30e16783d750c7786cbcc7d350f4d0aa

Authored by Andrey Kumanyaev
Committed by Dmitriy Zaporozhets
1 parent 7658f8c1

update all teams code. refactoring and some corrections

app/controllers/admin/teams/application_controller.rb
@@ -2,7 +2,6 @@ @@ -2,7 +2,6 @@
2 # 2 #
3 # Automatically sets the layout and ensures an administrator is logged in 3 # Automatically sets the layout and ensures an administrator is logged in
4 class Admin::Teams::ApplicationController < Admin::ApplicationController 4 class Admin::Teams::ApplicationController < Admin::ApplicationController
5 - before_filter :user_team  
6 5
7 private 6 private
8 7
app/controllers/admin/teams/members_controller.rb
1 class Admin::Teams::MembersController < Admin::Teams::ApplicationController 1 class Admin::Teams::MembersController < Admin::Teams::ApplicationController
2 def new 2 def new
3 @users = User.active 3 @users = User.active
4 - @users = @users.not_in_team(@team) if @team.members.any? 4 + @users = @users.not_in_team(user_team) if user_team.members.any?
5 @users = UserDecorator.decorate @users 5 @users = UserDecorator.decorate @users
6 end 6 end
7 7
@@ -10,10 +10,10 @@ class Admin::Teams::MembersController &lt; Admin::Teams::ApplicationController @@ -10,10 +10,10 @@ class Admin::Teams::MembersController &lt; Admin::Teams::ApplicationController
10 user_ids = params[:user_ids] 10 user_ids = params[:user_ids]
11 access = params[:default_project_access] 11 access = params[:default_project_access]
12 is_admin = params[:group_admin] 12 is_admin = params[:group_admin]
13 - @team.add_members(user_ids, access, is_admin) 13 + user_team.add_members(user_ids, access, is_admin)
14 end 14 end
15 15
16 - redirect_to admin_team_path(@team), notice: 'Members was successfully added.' 16 + redirect_to admin_team_path(user_team), notice: 'Members was successfully added into Team of users.'
17 end 17 end
18 18
19 def edit 19 def edit
@@ -22,24 +22,24 @@ class Admin::Teams::MembersController &lt; Admin::Teams::ApplicationController @@ -22,24 +22,24 @@ class Admin::Teams::MembersController &lt; Admin::Teams::ApplicationController
22 22
23 def update 23 def update
24 options = {default_projects_access: params[:default_project_access], group_admin: params[:group_admin]} 24 options = {default_projects_access: params[:default_project_access], group_admin: params[:group_admin]}
25 - if @team.update_membership(team_member, options)  
26 - redirect_to admin_team_path(@team), notice: 'Membership was successfully updated.' 25 + if user_team.update_membership(team_member, options)
  26 + redirect_to admin_team_path(user_team), notice: "Membership for #{team_member.name} was successfully updated in Team of users."
27 else 27 else
28 render :edit 28 render :edit
29 end 29 end
30 end 30 end
31 31
32 def destroy 32 def destroy
33 - if @team.remove_member(team_member)  
34 - redirect_to admin_team_path(@team), notice: "Member was successfully removed from team." 33 + if user_team.remove_member(team_member)
  34 + redirect_to admin_team_path(user_team), notice: "Member #{team_member.name} was successfully removed from Team of users."
35 else 35 else
36 - redirect_to admin_team_members(@team), notice: "Something wrong." 36 + redirect_to admin_team_members(user_team), notice: "Something is wrong."
37 end 37 end
38 end 38 end
39 39
40 protected 40 protected
41 41
42 def team_member 42 def team_member
43 - @member ||= @team.members.find(params[:id]) 43 + @member ||= user_team.members.find(params[:id])
44 end 44 end
45 end 45 end
app/controllers/admin/teams/projects_controller.rb
1 class Admin::Teams::ProjectsController < Admin::Teams::ApplicationController 1 class Admin::Teams::ProjectsController < Admin::Teams::ApplicationController
2 def new 2 def new
3 @projects = Project.scoped 3 @projects = Project.scoped
4 - @projects = @projects.without_team(@team) if @team.projects.any? 4 + @projects = @projects.without_team(user_team) if user_team.projects.any?
5 #@projects.reject!(&:empty_repo?) 5 #@projects.reject!(&:empty_repo?)
6 end 6 end
7 7
@@ -9,10 +9,10 @@ class Admin::Teams::ProjectsController &lt; Admin::Teams::ApplicationController @@ -9,10 +9,10 @@ class Admin::Teams::ProjectsController &lt; Admin::Teams::ApplicationController
9 unless params[:project_ids].blank? 9 unless params[:project_ids].blank?
10 project_ids = params[:project_ids] 10 project_ids = params[:project_ids]
11 access = params[:greatest_project_access] 11 access = params[:greatest_project_access]
12 - @team.assign_to_projects(project_ids, access) 12 + user_team.assign_to_projects(project_ids, access)
13 end 13 end
14 14
15 - redirect_to admin_team_path(@team), notice: 'Projects was successfully added.' 15 + redirect_to admin_team_path(user_team), notice: 'Team of users was successfully assgned to projects.'
16 end 16 end
17 17
18 def edit 18 def edit
@@ -20,22 +20,22 @@ class Admin::Teams::ProjectsController &lt; Admin::Teams::ApplicationController @@ -20,22 +20,22 @@ class Admin::Teams::ProjectsController &lt; Admin::Teams::ApplicationController
20 end 20 end
21 21
22 def update 22 def update
23 - if @team.update_project_access(team_project, params[:greatest_project_access])  
24 - redirect_to admin_team_path(@team), notice: 'Membership was successfully updated.' 23 + if user_team.update_project_access(team_project, params[:greatest_project_access])
  24 + redirect_to admin_team_path(user_team), notice: 'Access was successfully updated.'
25 else 25 else
26 render :edit 26 render :edit
27 end 27 end
28 end 28 end
29 29
30 def destroy 30 def destroy
31 - @team.resign_from_project(team_project)  
32 - redirect_to admin_team_path(@team), notice: 'Project was successfully removed.' 31 + user_team.resign_from_project(team_project)
  32 + redirect_to admin_team_path(user_team), notice: 'Team of users was successfully reassigned from project.'
33 end 33 end
34 34
35 protected 35 protected
36 36
37 def team_project 37 def team_project
38 - @project ||= @team.projects.find_by_path(params[:id]) 38 + @project ||= user_team.projects.find_with_namespace(params[:id])
39 end 39 end
40 40
41 end 41 end
app/controllers/admin/teams_controller.rb
@@ -24,12 +24,12 @@ class Admin::TeamsController &lt; Admin::ApplicationController @@ -24,12 +24,12 @@ class Admin::TeamsController &lt; Admin::ApplicationController
24 end 24 end
25 25
26 def create 26 def create
27 - user_team = UserTeam.new(params[:user_team])  
28 - user_team.path = user_team.name.dup.parameterize if user_team.name  
29 - user_team.owner = current_user 27 + @team = UserTeam.new(params[:user_team])
  28 + @team.path = @team.name.dup.parameterize if @team.name
  29 + @team.owner = current_user
30 30
31 - if user_team.save  
32 - redirect_to admin_team_path(user_team), notice: 'UserTeam was successfully created.' 31 + if @team.save
  32 + redirect_to admin_team_path(@team), notice: 'Team of users was successfully created.'
33 else 33 else
34 render action: "new" 34 render action: "new"
35 end 35 end
@@ -44,7 +44,7 @@ class Admin::TeamsController &lt; Admin::ApplicationController @@ -44,7 +44,7 @@ class Admin::TeamsController &lt; Admin::ApplicationController
44 end 44 end
45 45
46 if user_team.update_attributes(user_team_params) 46 if user_team.update_attributes(user_team_params)
47 - redirect_to admin_team_path(user_team), notice: 'UserTeam was successfully updated.' 47 + redirect_to admin_team_path(user_team), notice: 'Team of users was successfully updated.'
48 else 48 else
49 render action: "edit" 49 render action: "edit"
50 end 50 end
@@ -53,7 +53,7 @@ class Admin::TeamsController &lt; Admin::ApplicationController @@ -53,7 +53,7 @@ class Admin::TeamsController &lt; Admin::ApplicationController
53 def destroy 53 def destroy
54 user_team.destroy 54 user_team.destroy
55 55
56 - redirect_to admin_user_teams_path, notice: 'UserTeam was successfully deleted.' 56 + redirect_to admin_user_teams_path, notice: 'Team of users was successfully deleted.'
57 end 57 end
58 58
59 protected 59 protected
app/controllers/application_controller.rb
@@ -94,6 +94,14 @@ class ApplicationController &lt; ActionController::Base @@ -94,6 +94,14 @@ class ApplicationController &lt; ActionController::Base
94 return access_denied! unless can?(current_user, :download_code, project) 94 return access_denied! unless can?(current_user, :download_code, project)
95 end 95 end
96 96
  97 + def authorize_manage_user_team!
  98 + return access_denied! unless user_team.present? && can?(current_user, :manage_user_team, user_team)
  99 + end
  100 +
  101 + def authorize_admin_user_team!
  102 + return access_denied! unless user_team.present? && can?(current_user, :admin_user_team, user_team)
  103 + end
  104 +
97 def access_denied! 105 def access_denied!
98 render "errors/access_denied", layout: "errors", status: 404 106 render "errors/access_denied", layout: "errors", status: 404
99 end 107 end
@@ -135,4 +143,5 @@ class ApplicationController &lt; ActionController::Base @@ -135,4 +143,5 @@ class ApplicationController &lt; ActionController::Base
135 def dev_tools 143 def dev_tools
136 Rack::MiniProfiler.authorize_request 144 Rack::MiniProfiler.authorize_request
137 end 145 end
  146 +
138 end 147 end
app/controllers/team_members_controller.rb
@@ -4,6 +4,7 @@ class TeamMembersController &lt; ProjectResourceController @@ -4,6 +4,7 @@ class TeamMembersController &lt; ProjectResourceController
4 before_filter :authorize_admin_project!, except: [:index, :show] 4 before_filter :authorize_admin_project!, except: [:index, :show]
5 5
6 def index 6 def index
  7 + @teams = UserTeam.scoped
7 end 8 end
8 9
9 def show 10 def show
app/controllers/teams/application_controller.rb
@@ -5,11 +5,7 @@ class Teams::ApplicationController &lt; ApplicationController @@ -5,11 +5,7 @@ class Teams::ApplicationController &lt; ApplicationController
5 protected 5 protected
6 6
7 def user_team 7 def user_team
8 - @user_team ||= UserTeam.find_by_path(params[:team_id])  
9 - end  
10 -  
11 - def authorize_manage_user_team!  
12 - return access_denied! unless can?(current_user, :manage_user_team, user_team) 8 + @team ||= UserTeam.find_by_path(params[:team_id])
13 end 9 end
14 10
15 end 11 end
app/controllers/teams/members_controller.rb
1 class Teams::MembersController < Teams::ApplicationController 1 class Teams::MembersController < Teams::ApplicationController
2 - # Authorize 2 +
3 skip_before_filter :authorize_manage_user_team!, only: [:index] 3 skip_before_filter :authorize_manage_user_team!, only: [:index]
4 4
5 def index 5 def index
6 - @members = @user_team.members  
7 - end  
8 -  
9 - def show  
10 - @team_member = @user_team.members.find(params[:id])  
11 - @events = @team_member.recent_events.limit(7) 6 + @members = user_team.members
12 end 7 end
13 8
14 def new 9 def new
15 - @team_member = @user_team.members.new 10 + @users = User.active
  11 + @users = @users.not_in_team(user_team) if user_team.members.any?
  12 + @users = UserDecorator.decorate @users
16 end 13 end
17 14
18 def create 15 def create
19 - users = User.where(id: params[:user_ids]) 16 + unless params[:user_ids].blank?
  17 + user_ids = params[:user_ids]
  18 + access = params[:default_project_access]
  19 + is_admin = params[:group_admin]
  20 + user_team.add_members(user_ids, access, is_admin)
  21 + end
20 22
21 - @project.team << [users, params[:default_project_access]] 23 + redirect_to team_path(user_team), notice: 'Members was successfully added into Team of users.'
  24 + end
22 25
23 - if params[:redirect_to]  
24 - redirect_to params[:redirect_to]  
25 - else  
26 - redirect_to project_team_index_path(@project)  
27 - end 26 + def edit
  27 + team_member
28 end 28 end
29 29
30 def update 30 def update
31 - @team_member = @user_team.members.find(params[:id])  
32 - @team_member.update_attributes(params[:team_member])  
33 -  
34 - unless @team_member.valid?  
35 - flash[:alert] = "User should have at least one role" 31 + options = {default_projects_access: params[:default_project_access], group_admin: params[:group_admin]}
  32 + if user_team.update_membership(team_member, options)
  33 + redirect_to team_path(user_team), notice: "Membership for #{team_member.name} was successfully updated in Team of users."
  34 + else
  35 + render :edit
36 end 36 end
37 - redirect_to team_member_path(@project)  
38 end 37 end
39 38
40 def destroy 39 def destroy
41 - @team_member = project.users_projects.find(params[:id])  
42 - @team_member.destroy  
43 -  
44 - respond_to do |format|  
45 - format.html { redirect_to project_team_index_path(@project) }  
46 - format.js { render nothing: true } 40 + if user_team.remove_member(team_member)
  41 + redirect_to team_path(user_team), notice: "Member #{team_member.name} was successfully removed from Team of users."
  42 + else
  43 + redirect_to team_members(user_team), notice: "Something is wrong."
47 end 44 end
48 end 45 end
49 46
50 - def apply_import  
51 - giver = Project.find(params[:source_project_id])  
52 - status = @project.team.import(giver)  
53 - notice = status ? "Succesfully imported" : "Import failed" 47 + protected
54 48
55 - redirect_to project_team_members_path(project), notice: notice 49 + def team_member
  50 + @member ||= user_team.members.find(params[:id])
56 end 51 end
57 52
58 end 53 end
app/controllers/teams/projects_controller.rb
@@ -8,9 +8,12 @@ class Teams::ProjectsController &lt; Teams::ApplicationController @@ -8,9 +8,12 @@ class Teams::ProjectsController &lt; Teams::ApplicationController
8 end 8 end
9 9
10 def new 10 def new
11 - @projects = Project.scoped  
12 - @projects = @projects.without_team(user_team) if user_team.projects.any? 11 + user_team
  12 + @avaliable_projects = Project.scoped
  13 + @avaliable_projects = @avaliable_projects.without_team(user_team) if user_team.projects.any?
13 #@projects.reject!(&:empty_repo?) 14 #@projects.reject!(&:empty_repo?)
  15 +
  16 + redirect_to team_projects_path(user_team), notice: "No avalible projects." unless @avaliable_projects.any?
14 end 17 end
15 18
16 def create 19 def create
@@ -20,7 +23,7 @@ class Teams::ProjectsController &lt; Teams::ApplicationController @@ -20,7 +23,7 @@ class Teams::ProjectsController &lt; Teams::ApplicationController
20 user_team.assign_to_projects(project_ids, access) 23 user_team.assign_to_projects(project_ids, access)
21 end 24 end
22 25
23 - redirect_to admin_team_path(user_team), notice: 'Projects was successfully added.' 26 + redirect_to team_projects_path(user_team), notice: 'Team of users was successfully assgned to projects.'
24 end 27 end
25 28
26 def edit 29 def edit
@@ -29,7 +32,7 @@ class Teams::ProjectsController &lt; Teams::ApplicationController @@ -29,7 +32,7 @@ class Teams::ProjectsController &lt; Teams::ApplicationController
29 32
30 def update 33 def update
31 if user_team.update_project_access(team_project, params[:greatest_project_access]) 34 if user_team.update_project_access(team_project, params[:greatest_project_access])
32 - redirect_to admin_team_path(user_team), notice: 'Membership was successfully updated.' 35 + redirect_to team_projects_path(user_team), notice: 'Access was successfully updated.'
33 else 36 else
34 render :edit 37 render :edit
35 end 38 end
@@ -37,13 +40,13 @@ class Teams::ProjectsController &lt; Teams::ApplicationController @@ -37,13 +40,13 @@ class Teams::ProjectsController &lt; Teams::ApplicationController
37 40
38 def destroy 41 def destroy
39 user_team.resign_from_project(team_project) 42 user_team.resign_from_project(team_project)
40 - redirect_to admin_team_path(user_team), notice: 'Project was successfully removed.' 43 + redirect_to team_projects_path(user_team), notice: 'Team of users was successfully reassigned from project.'
41 end 44 end
42 45
43 private 46 private
44 47
45 def team_project 48 def team_project
46 - @project ||= @team.projects.find_by_path(params[:id]) 49 + @project ||= user_team.projects.find_with_namespace(params[:id])
47 end 50 end
48 51
49 end 52 end
app/controllers/teams_controller.rb
1 class TeamsController < ApplicationController 1 class TeamsController < ApplicationController
2 - respond_to :html  
3 - layout 'user_team', only: [:show, :edit, :update, :destroy, :issues, :merge_requests, :search] 2 + # Authorize
  3 + before_filter :authorize_manage_user_team!
  4 + before_filter :authorize_admin_user_team!
4 5
5 - before_filter :user_team, only: [:show, :edit, :update, :destroy, :issues, :merge_requests, :search]  
6 - before_filter :projects, only: [:show, :edit, :update, :destroy, :issues, :merge_requests, :search] 6 + # Skip access control on public section
  7 + skip_before_filter :authorize_manage_user_team!, only: [:index, :show, :new, :destroy, :create, :search, :issues, :merge_requests]
  8 + skip_before_filter :authorize_admin_user_team!, only: [:index, :show, :new, :create, :search, :issues, :merge_requests]
7 9
8 - # Authorize  
9 - before_filter :authorize_manage_user_team!, only: [:edit, :update]  
10 - before_filter :authorize_admin_user_team!, only: [:destroy] 10 + layout 'user_team', only: [:show, :edit, :update, :destroy, :issues, :merge_requests, :search]
11 11
12 def index 12 def index
13 - @teams = UserTeam.all 13 + @teams = UserTeam.order('name ASC')
14 end 14 end
15 15
16 def show 16 def show
17 - @events = Event.in_projects(project_ids).limit(20).offset(params[:offset] || 0)  
18 -  
19 - respond_to do |format|  
20 - format.html  
21 - format.js  
22 - format.atom { render layout: false }  
23 - end 17 + user_team
  18 + projects
  19 + @events = Event.in_projects(user_team.project_ids).limit(20).offset(params[:offset] || 0)
24 end 20 end
25 21
26 def edit 22 def edit
27 - 23 + user_team
28 end 24 end
29 25
30 def update 26 def update
@@ -58,56 +54,37 @@ class TeamsController &lt; ApplicationController @@ -58,56 +54,37 @@ class TeamsController &lt; ApplicationController
58 54
59 # Get authored or assigned open merge requests 55 # Get authored or assigned open merge requests
60 def merge_requests 56 def merge_requests
61 - @merge_requests = MergeRequest.of_user_team(@user_team) 57 + @merge_requests = MergeRequest.of_user_team(user_team)
62 @merge_requests = FilterContext.new(@merge_requests, params).execute 58 @merge_requests = FilterContext.new(@merge_requests, params).execute
63 @merge_requests = @merge_requests.recent.page(params[:page]).per(20) 59 @merge_requests = @merge_requests.recent.page(params[:page]).per(20)
64 end 60 end
65 61
66 # Get only assigned issues 62 # Get only assigned issues
67 def issues 63 def issues
68 - @issues = Issue.of_user_team(@user_team) 64 + @issues = Issue.of_user_team(user_team)
69 @issues = FilterContext.new(@issues, params).execute 65 @issues = FilterContext.new(@issues, params).execute
70 @issues = @issues.recent.page(params[:page]).per(20) 66 @issues = @issues.recent.page(params[:page]).per(20)
71 @issues = @issues.includes(:author, :project) 67 @issues = @issues.includes(:author, :project)
72 -  
73 - respond_to do |format|  
74 - format.html  
75 - format.atom { render layout: false }  
76 - end  
77 end 68 end
78 69
79 def search 70 def search
80 - result = SearchContext.new(project_ids, params).execute 71 + result = SearchContext.new(user_team.project_ids, params).execute
81 72
82 @projects = result[:projects] 73 @projects = result[:projects]
83 @merge_requests = result[:merge_requests] 74 @merge_requests = result[:merge_requests]
84 @issues = result[:issues] 75 @issues = result[:issues]
85 @wiki_pages = result[:wiki_pages] 76 @wiki_pages = result[:wiki_pages]
  77 + @teams = result[:teams]
86 end 78 end
87 79
88 protected 80 protected
89 81
90 - def user_team  
91 - @user_team ||= UserTeam.find_by_path(params[:id])  
92 - end  
93 -  
94 def projects 82 def projects
95 @projects ||= user_team.projects.sorted_by_activity 83 @projects ||= user_team.projects.sorted_by_activity
96 end 84 end
97 85
98 - def project_ids  
99 - projects.map(&:id)  
100 - end  
101 -  
102 - def authorize_manage_user_team!  
103 - unless user_team.present? or can?(current_user, :manage_user_team, user_team)  
104 - return render_404  
105 - end 86 + def user_team
  87 + @team ||= UserTeam.find_by_path(params[:id])
106 end 88 end
107 89
108 - def authorize_admin_user_team!  
109 - unless user_team.owner == current_user || current_user.admin?  
110 - return render_404  
111 - end  
112 - end  
113 end 90 end
app/views/admin/teams/index.html.haml
@@ -34,4 +34,5 @@ @@ -34,4 +34,5 @@
34 %td.bgred 34 %td.bgred
35 = link_to 'Rename', edit_admin_team_path(team), id: "edit_#{dom_id(team)}", class: "btn small" 35 = link_to 'Rename', edit_admin_team_path(team), id: "edit_#{dom_id(team)}", class: "btn small"
36 = link_to 'Destroy', admin_team_path(team), confirm: "REMOVE #{team.name}? Are you sure?", method: :delete, class: "btn small danger" 36 = link_to 'Destroy', admin_team_path(team), confirm: "REMOVE #{team.name}? Are you sure?", method: :delete, class: "btn small danger"
  37 +
37 = paginate @teams, theme: "admin" 38 = paginate @teams, theme: "admin"
app/views/admin/teams/new.html.haml
@@ -14,8 +14,6 @@ @@ -14,8 +14,6 @@
14 %hr 14 %hr
15 .padded 15 .padded
16 %ul 16 %ul
17 - %li Team is kind of directory for several projects  
18 - %li All created teams are private 17 + %li All created teams are public (users can view who enter into team and which project are assigned for this team)
19 %li People within a team see only projects they have access to 18 %li People within a team see only projects they have access to
20 - %li All projects of team will be stored in team directory  
21 - %li You will be able to move existing projects into team 19 + %li You will be able to assign existing projects for team
app/views/admin/teams/show.html.haml
@@ -40,54 +40,51 @@ @@ -40,54 +40,51 @@
40 = link_to "Cancel", "#", class: "btn change-owner-cancel-link" 40 = link_to "Cancel", "#", class: "btn change-owner-cancel-link"
41 41
42 %fieldset 42 %fieldset
43 - %legend Members (#{@team.members.count})  
44 - %table#members_list  
45 - %thead  
46 - %tr  
47 - %th User name  
48 - %th Default project access  
49 - %th Team access  
50 - %th.cred Danger Zone!  
51 - - @team.members.each do |member|  
52 - %tr.member  
53 - %td  
54 - = link_to [:admin, member] do  
55 - = member.name  
56 - %small= "(#{member.email})"  
57 - %td= @team.human_default_projects_access(member)  
58 - %td= @team.admin?(member) ? "Admin" : "Member"  
59 - %td.bgred  
60 - = link_to 'Edit', edit_admin_team_member_path(@team, member), class: "btn small"  
61 - &nbsp;  
62 - = link_to 'Remove', admin_team_member_path(@team, member), confirm: 'Remove member from team. Are you sure?', method: :delete, class: "btn danger small"  
63 - %tr  
64 - %td  
65 - %td  
66 - %td  
67 - %td= link_to 'Add members', new_admin_team_member_path(@team), class: "btn primary", id: :add_members_to_team 43 + %legend
  44 + Members (#{@team.members.count})
  45 + %span= link_to 'Add members', new_admin_team_member_path(@team), class: "btn success small right", id: :add_members_to_team
  46 + - if @team.members.any?
  47 + %table#members_list
  48 + %thead
  49 + %tr
  50 + %th User name
  51 + %th Default project access
  52 + %th Team access
  53 + %th.cred.span3 Danger Zone!
  54 + - @team.members.each do |member|
  55 + %tr.member
  56 + %td
  57 + = link_to [:admin, member] do
  58 + = member.name
  59 + %small= "(#{member.email})"
  60 + %td= @team.human_default_projects_access(member)
  61 + %td= @team.admin?(member) ? "Admin" : "Member"
  62 + %td.bgred
  63 + = link_to 'Edit', edit_admin_team_member_path(@team, member), class: "btn small"
  64 + &nbsp;
  65 + = link_to 'Remove', admin_team_member_path(@team, member), confirm: 'Remove member from team. Are you sure?', method: :delete, class: "btn danger small"
68 66
69 %fieldset 67 %fieldset
70 - %legend Projects (#{@team.projects.count})  
71 - %table#projects_list  
72 - %thead  
73 - %tr  
74 - %th Project name  
75 - %th Max access  
76 - %th.cred Danger Zone!  
77 - - @team.projects.each do |project|  
78 - %tr.project  
79 - %td  
80 - = link_to project.name_with_namespace, [:admin, project]  
81 - %td  
82 - %span= @team.human_max_project_access(project)  
83 - %td.bgred  
84 - = link_to 'Edit', edit_admin_team_project_path(@team, project), class: "btn small"  
85 - &nbsp;  
86 - = link_to 'Relegate', admin_team_project_path(@team, project), confirm: 'Remove project from team. Are you sure?', method: :delete, class: "btn danger small"  
87 - %tr  
88 - %td  
89 - %td  
90 - %td= link_to 'Add projects', new_admin_team_project_path(@team), class: "btn primary", id: :assign_projects_to_team 68 + %legend
  69 + Projects (#{@team.projects.count})
  70 + %span= link_to 'Add projects', new_admin_team_project_path(@team), class: "btn success small right", id: :assign_projects_to_team
  71 + - if @team.projects.any?
  72 + %table#projects_list
  73 + %thead
  74 + %tr
  75 + %th Project name
  76 + %th Max access
  77 + %th.cred.span3 Danger Zone!
  78 + - @team.projects.each do |project|
  79 + %tr.project
  80 + %td
  81 + = link_to project.name_with_namespace, [:admin, project]
  82 + %td
  83 + %span= @team.human_max_project_access(project)
  84 + %td.bgred
  85 + = link_to 'Edit', edit_admin_team_project_path(@team, project), class: "btn small"
  86 + &nbsp;
  87 + = link_to 'Relegate', admin_team_project_path(@team, project), confirm: 'Remove project from team. Are you sure?', method: :delete, class: "btn danger small"
91 88
92 :javascript 89 :javascript
93 $(function(){ 90 $(function(){
app/views/dashboard/_teams.html.haml
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 %h5.title 2 %h5.title
3 My Teams 3 My Teams
4 %small 4 %small
5 - (#{teams.count}) 5 + (#{@teams.count})
6 %span.right 6 %span.right
7 = link_to new_team_path, class: "btn very_small info" do 7 = link_to new_team_path, class: "btn very_small info" do
8 %i.icon-plus 8 %i.icon-plus
@@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@
12 %i.icon-user 12 %i.icon-user
13 All Teams 13 All Teams
14 %ul.well-list 14 %ul.well-list
15 - - teams.each do |team| 15 + - @teams.each do |team|
16 %li 16 %li
17 = link_to team_path(id: team.path), class: dom_class(team) do 17 = link_to team_path(id: team.path), class: dom_class(team) do
18 %strong.well-title= truncate(team.name, length: 35) 18 %strong.well-title= truncate(team.name, length: 35)
@@ -20,4 +20,7 @@ @@ -20,4 +20,7 @@
20 &rarr; 20 &rarr;
21 %span.last_activity 21 %span.last_activity
22 %strong Projects: 22 %strong Projects:
23 - %span= current_user.authorized_projects.in_team(team).count 23 + %span= team.projects.count
  24 + %span.last_activity
  25 + %strong Members:
  26 + %span= team.members.count
app/views/layouts/_head_panel.html.haml
@@ -8,6 +8,9 @@ @@ -8,6 +8,9 @@
8 %span.separator 8 %span.separator
9 %h1.project_name= title 9 %h1.project_name= title
10 %ul.nav 10 %ul.nav
  11 + %li
  12 + = link_to teams_path, title: "Teams of users", class: 'has_bottom_tooltip', 'data-original-title' => 'Teams list' do
  13 + %i.icon-globe
11 - if current_user.is_admin? 14 - if current_user.is_admin?
12 %li 15 %li
13 = link_to admin_root_path, title: "Admin area", class: 'has_bottom_tooltip', 'data-original-title' => 'Admin area' do 16 = link_to admin_root_path, title: "Admin area", class: 'has_bottom_tooltip', 'data-original-title' => 'Admin area' do
app/views/layouts/user_team.html.haml
1 !!! 5 1 !!! 5
2 %html{ lang: "en"} 2 %html{ lang: "en"}
3 - = render "layouts/head", title: "#{@user_team.name}" 3 + = render "layouts/head", title: "#{@team.name}"
4 %body{class: "#{app_theme} application"} 4 %body{class: "#{app_theme} application"}
5 = render "layouts/flash" 5 = render "layouts/flash"
6 - = render "layouts/head_panel", title: "#{@user_team.name}" 6 + = render "layouts/head_panel", title: "#{@team.name}"
7 .container 7 .container
8 %ul.main_menu 8 %ul.main_menu
9 = nav_link(path: 'teams#show', html_options: {class: 'home'}) do 9 = nav_link(path: 'teams#show', html_options: {class: 'home'}) do
10 - = link_to "Home", team_path(@user_team), title: "Home" 10 + = link_to "Home", team_path(@team), title: "Home"
11 = nav_link(path: 'teams#issues') do 11 = nav_link(path: 'teams#issues') do
12 - = link_to issues_team_path(@user_team) do 12 + = link_to issues_team_path(@team) do
13 Issues 13 Issues
14 - %span.count= Issue.opened.of_user_team(@user_team).count 14 + %span.count= Issue.opened.of_user_team(@team).count
15 = nav_link(path: 'teams#merge_requests') do 15 = nav_link(path: 'teams#merge_requests') do
16 - = link_to merge_requests_team_path(@user_team) do 16 + = link_to merge_requests_team_path(@team) do
17 Merge Requests 17 Merge Requests
18 - %span.count= MergeRequest.opened.of_user_team(@user_team).count 18 + %span.count= MergeRequest.opened.of_user_team(@team).count
19 = nav_link(path: 'teams#search') do 19 = nav_link(path: 'teams#search') do
20 - = link_to "Search", search_team_path(@user_team) 20 + = link_to "Search", search_team_path(@team)
21 21
22 .content= yield 22 .content= yield
app/views/teams/_team_head.html.haml
1 %ul.nav.nav-tabs 1 %ul.nav.nav-tabs
2 = nav_link(path: 'teams#show') do 2 = nav_link(path: 'teams#show') do
3 - = link_to team_path(@user_team), class: "activities-tab tab" do 3 + = link_to team_path(@team), class: "activities-tab tab" do
4 %i.icon-home 4 %i.icon-home
5 Show 5 Show
6 = nav_link(controller: [:members]) do 6 = nav_link(controller: [:members]) do
7 - = link_to team_members_path(@user_team), class: "team-tab tab" do 7 + = link_to team_members_path(@team), class: "team-tab tab" do
8 %i.icon-user 8 %i.icon-user
9 Members 9 Members
10 = nav_link(controller: [:projects]) do 10 = nav_link(controller: [:projects]) do
11 - = link_to team_projects_path(@user_team), class: "team-tab tab" do 11 + = link_to team_projects_path(@team), class: "team-tab tab" do
12 %i.icon-briefcase 12 %i.icon-briefcase
13 Projects 13 Projects
14 14
15 - - if can? current_user, :manage_user_team, @user_team 15 + - if can? current_user, :admin_user_team, @team
16 = nav_link(path: 'teams#edit', html_options: {class: 'right'}) do 16 = nav_link(path: 'teams#edit', html_options: {class: 'right'}) do
17 - = link_to edit_team_path(@user_team), class: "stat-tab tab " do 17 + = link_to edit_team_path(@team), class: "stat-tab tab " do
18 %i.icon-edit 18 %i.icon-edit
19 - Edit 19 + Edit Team
app/views/teams/edit.html.haml
1 = render "team_head" 1 = render "team_head"
2 2
3 -%h3.page_title= "Edit Team #{@user_team.name}" 3 +%h3.page_title= "Edit Team #{@team.name}"
4 %hr 4 %hr
5 -= form_for @user_team, url: teams_path do |f|  
6 - - if @user_team.errors.any? 5 += form_for @team, url: teams_path do |f|
  6 + - if @team.errors.any?
7 .alert-message.block-message.error 7 .alert-message.block-message.error
8 - %span= @user_team.errors.full_messages.first 8 + %span= @team.errors.full_messages.first
9 .clearfix 9 .clearfix
10 = f.label :name do 10 = f.label :name do
11 Team name is 11 Team name is
@@ -21,12 +21,4 @@ @@ -21,12 +21,4 @@
21 .input.span3.center 21 .input.span3.center
22 = f.submit 'Save team changes', class: "btn primary" 22 = f.submit 'Save team changes', class: "btn primary"
23 .input.span3.center 23 .input.span3.center
24 - = link_to 'Delete team', team_path(@user_team), method: :delete, confirm: "You are shure?", class: "btn danger"  
25 - %hr  
26 - .padded  
27 - %ul  
28 - %li Team is kind of directory for several projects  
29 - %li All created teams are private  
30 - %li People within a team see only projects they have access to  
31 - %li All projects of team will be stored in team directory  
32 - %li You will be able to move existing projects into team 24 + = link_to 'Delete team', team_path(@team), method: :delete, confirm: "You are shure?", class: "btn danger"
app/views/teams/index.html.haml
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 %small 3 %small
4 list of all teams 4 list of all teams
5 5
6 - = link_to 'New Team', new_team_path, class: "btn small right" 6 + = link_to 'New Team', new_team_path, class: "btn success small right"
7 %br 7 %br
8 8
9 = form_tag search_teams_path, method: :get, class: 'form-inline' do 9 = form_tag search_teams_path, method: :get, class: 'form-inline' do
@@ -32,6 +32,7 @@ @@ -32,6 +32,7 @@
32 %td= link_to team.owner.name, team_member_path(team, team.owner) 32 %td= link_to team.owner.name, team_member_path(team, team.owner)
33 %td 33 %td
34 - if current_user.can?(:manage_user_team, team) 34 - if current_user.can?(:manage_user_team, team)
35 - - if team.owner == current_user 35 + - if current_user.can?(:admin_user_team, team)
36 = link_to "Destroy", team_path(team), method: :delete, confirm: "You are shure?", class: "danger btn small right" 36 = link_to "Destroy", team_path(team), method: :delete, confirm: "You are shure?", class: "danger btn small right"
  37 + &nbsp;
37 = link_to "Edit", edit_team_path(team), class: "btn small right" 38 = link_to "Edit", edit_team_path(team), class: "btn small right"
app/views/teams/members/_form.html.haml
1 -%h3.page_title  
2 - = "New Team member(s)"  
3 -%hr  
4 -= form_for @team_member, as: :team_member, url: project_team_members_path(@project, @team_member) do |f|  
5 - -if @team_member.errors.any? 1 += form_tag admin_team_member_path(@team, @member), method: :put do
  2 + -if @member.errors.any?
6 .alert-message.block-message.error 3 .alert-message.block-message.error
7 %ul 4 %ul
8 - - @team_member.errors.full_messages.each do |msg| 5 + - @member.errors.full_messages.each do |msg|
9 %li= msg 6 %li= msg
10 7
11 - %h6 1. Choose people you want in the team  
12 .clearfix 8 .clearfix
13 - = f.label :user_ids, "People"  
14 - .input= select_tag(:user_ids, options_from_collection_for_select(User.active.not_in_project(@project).alphabetically, :id, :name), {data: {placeholder: "Select users"}, class: "chosen xxlarge", multiple: true})  
15 -  
16 - %h6 2. Set access level for them 9 + %label Default access for Team projects:
  10 + .input
  11 + = select_tag :default_project_access, options_for_select(UserTeam.access_roles, @team.default_projects_access(@member)), class: "project-access-select chosen span3"
17 .clearfix 12 .clearfix
18 - = f.label :project_access, "Project Access"  
19 - .input= select_tag :project_access, options_for_select(Project.access_options, @team_member.project_access), class: "project-access-select chosen" 13 + %label Team admin?
  14 + .input
  15 + = check_box_tag :group_admin, true, @team.admin?(@member)
20 16
  17 + %br
21 .actions 18 .actions
22 - = f.submit 'Save', class: "btn save-btn"  
23 - = link_to "Cancel", project_team_index_path(@project), class: "btn cancel-btn" 19 + = submit_tag 'Save', class: "btn primary"
  20 + = link_to 'Cancel', :back, class: "btn"
app/views/teams/members/_show.html.haml
1 - user = member.user 1 - user = member.user
2 -- allow_admin = can? current_user, :manage_user_team, @user_team 2 +- allow_admin = can? current_user, :manage_user_team, @team
3 %li{id: dom_id(member), class: "team_member_row user_#{user.id}"} 3 %li{id: dom_id(member), class: "team_member_row user_#{user.id}"}
4 .row 4 .row
5 .span5 5 .span5
6 - = link_to team_member_path(@user_team, user), title: user.name, class: "dark" do 6 + = link_to team_member_path(@team, user), title: user.name, class: "dark" do
7 = image_tag gravatar_icon(user.email, 40), class: "avatar s32" 7 = image_tag gravatar_icon(user.email, 40), class: "avatar s32"
8 - = link_to team_member_path(@user_team, user), title: user.name, class: "dark" do 8 + = link_to team_member_path(@team, user), title: user.name, class: "dark" do
9 %strong= truncate(user.name, lenght: 40) 9 %strong= truncate(user.name, lenght: 40)
10 %br 10 %br
11 %small.cgray= user.email 11 %small.cgray= user.email
@@ -13,8 +13,8 @@ @@ -13,8 +13,8 @@
13 .span6.right 13 .span6.right
14 - if allow_admin 14 - if allow_admin
15 .left.span2 15 .left.span2
16 - = form_for(member, as: :team_member, url: team_member_path(@user_team, user)) do |f|  
17 - = f.select :permission, options_for_select(UsersProject.access_roles, @user_team.default_projects_access(user)), {}, class: "medium project-access-select span2" 16 + = form_for(member, as: :team_member, url: team_member_path(@team, user)) do |f|
  17 + = f.select :permission, options_for_select(UsersProject.access_roles, @team.default_projects_access(user)), {}, class: "medium project-access-select span2"
18 .left.span2 18 .left.span2
19 %span 19 %span
20 Admin access 20 Admin access
@@ -22,10 +22,10 @@ @@ -22,10 +22,10 @@
22 .right 22 .right
23 - if current_user == user 23 - if current_user == user
24 %span.btn.disabled This is you! 24 %span.btn.disabled This is you!
25 - - if @user_team.owner == user 25 + - if @team.owner == user
26 %span.btn.disabled.success Owner 26 %span.btn.disabled.success Owner
27 - elsif user.blocked 27 - elsif user.blocked
28 %span.btn.disabled.blocked Blocked 28 %span.btn.disabled.blocked Blocked
29 - elsif allow_admin 29 - elsif allow_admin
30 - = link_to team_member_path(@user_team, user), confirm: remove_from_user_team_message(@user_team, user), method: :delete, class: "very_small btn danger" do 30 + = link_to team_member_path(@team, user), confirm: remove_from_user_team_message(@team, user), method: :delete, class: "very_small btn danger" do
31 %i.icon-minus.icon-white 31 %i.icon-minus.icon-white
app/views/teams/members/_team.html.haml
1 -- grouped_user_team_members(@user_team).each do |access, members| 1 +- grouped_user_team_members(@team).each do |access, members|
2 .ui-box 2 .ui-box
3 %h5.title 3 %h5.title
4 = Project.access_options.key(access).pluralize 4 = Project.access_options.key(access).pluralize
app/views/teams/members/edit.html.haml
1 -%h1 Teams::Members#edit  
2 -%p Find me in app/views/teams/members/edit.html.haml  
3 \ No newline at end of file 1 \ No newline at end of file
  2 += render "teams/team_head"
  3 +
  4 +%h3
  5 + Edit access #{@member.name} in #{@team.name} team
  6 +
  7 +%hr
  8 +%table.zebra-striped
  9 + %tr
  10 + %td User:
  11 + %td= @member.name
  12 + %tr
  13 + %td Team:
  14 + %td= @team.name
  15 + %tr
  16 + %td Since:
  17 + %td= member_since(@team, @member).stamp("Nov 11, 2010")
  18 +
  19 += render 'form'
app/views/teams/members/import.html.haml
@@ -1,17 +0,0 @@ @@ -1,17 +0,0 @@
1 -= render "projects/project_head"  
2 -  
3 -%h3.page_title  
4 - = "Import team from another project"  
5 -%hr  
6 -%p.slead  
7 - Read more about team import #{link_to "here", '#', class: 'vlink'}.  
8 -= form_tag apply_import_project_team_members_path(@project), method: 'post' do  
9 - %p.slead Choose project you want to use as team source:  
10 - .padded  
11 - = label_tag :source_project_id, "Project"  
12 - .input= select_tag(:source_project_id, options_from_collection_for_select(current_user.authorized_projects, :id, :name_with_namespace), prompt: "Select project", class: "chosen xxlarge", required: true)  
13 -  
14 - .actions  
15 - = submit_tag 'Import', class: "btn save-btn"  
16 - = link_to "Cancel", project_team_index_path(@project), class: "btn cancel-btn"  
17 -  
app/views/teams/members/index.html.haml
1 = render "teams/team_head" 1 = render "teams/team_head"
  2 +
2 %h3.page_title 3 %h3.page_title
3 Team Members 4 Team Members
4 (#{@members.count}) 5 (#{@members.count})
@@ -6,13 +7,13 @@ @@ -6,13 +7,13 @@
6 Read more about project permissions 7 Read more about project permissions
7 %strong= link_to "here", help_permissions_path, class: "vlink" 8 %strong= link_to "here", help_permissions_path, class: "vlink"
8 9
9 - - if can? current_user, :manage_user_team, @user_team 10 + - if can? current_user, :manage_user_team, @team
10 %span.right 11 %span.right
11 - = link_to new_team_member_path(@user_team), class: "btn success small grouped", title: "New Team Member" do 12 + = link_to new_team_member_path(@team), class: "btn success small grouped", title: "New Team Member" do
12 New Team Member 13 New Team Member
13 %hr 14 %hr
14 15
15 16
16 .clearfix 17 .clearfix
17 %div.team-table 18 %div.team-table
18 - = render partial: "teams/members/team", locals: {project: @user_team} 19 + = render partial: "teams/members/team", locals: {project: @team}
app/views/teams/members/new.html.haml
1 -= render "projects/project_head"  
2 -= render "team_members/form" 1 += render "teams/team_head"
  2 +
  3 +%h3.page_title
  4 + Team: #{@team.name}
  5 +
  6 +%fieldset
  7 + %legend Members (#{@team.members.count})
  8 + = form_tag team_members_path(@team), id: "team_members", class: "bulk_import", method: :post do
  9 + %table#members_list
  10 + %thead
  11 + %tr
  12 + %th User name
  13 + %th Default project access
  14 + %th Team access
  15 + %th
  16 + - @team.members.each do |member|
  17 + %tr.member
  18 + %td
  19 + = member.name
  20 + %small= "(#{member.email})"
  21 + %td= @team.human_default_projects_access(member)
  22 + %td= @team.admin?(member) ? "Admin" : "Member"
  23 + %td
  24 + %tr
  25 + %td= select_tag :user_ids, options_from_collection_for_select(@users , :id, :name_with_email), multiple: true, data: {placeholder: 'Select users'}, class: 'chosen span5'
  26 + %td= select_tag :default_project_access, options_for_select(Project.access_options), {class: "project-access-select chosen span3" }
  27 + %td
  28 + %span= check_box_tag :group_admin
  29 + %span Admin?
  30 + %td= submit_tag 'Add', class: "btn primary", id: :add_members_to_team
app/views/teams/members/show.html.haml
  1 += render "teams/team_head"
  2 +
1 - allow_admin = can? current_user, :admin_project, @project 3 - allow_admin = can? current_user, :admin_project, @project
2 - user = @team_member.user 4 - user = @team_member.user
3 5
app/views/teams/merge_requests.html.haml
  1 += render "team_head"
  2 +
1 %h3.page_title 3 %h3.page_title
2 Merge Requests 4 Merge Requests
3 %small (authored by or assigned to Team members) 5 %small (authored by or assigned to Team members)
app/views/teams/new.html.haml
@@ -14,8 +14,6 @@ @@ -14,8 +14,6 @@
14 %hr 14 %hr
15 .padded 15 .padded
16 %ul 16 %ul
17 - %li Team is kind of directory for several projects  
18 - %li All created teams are private 17 + %li All created teams are public (users can view who enter into team and which project are assigned for this team)
19 %li People within a team see only projects they have access to 18 %li People within a team see only projects they have access to
20 - %li All projects of team will be stored in team directory  
21 - %li You will be able to move existing projects into team 19 + %li You will be able to assign existing projects for team
app/views/teams/projects/_form.html.haml 0 → 100644
@@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
  1 += form_tag team_project_path(@team, @project), method: :put do
  2 + -if @project.errors.any?
  3 + .alert-message.block-message.error
  4 + %ul
  5 + - @project.errors.full_messages.each do |msg|
  6 + %li= msg
  7 +
  8 + .clearfix
  9 + %label Max access for Team members:
  10 + .input
  11 + = select_tag :greatest_project_access, options_for_select(UserTeam.access_roles, @team.max_project_access(@project)), class: "project-access-select chosen span3"
  12 +
  13 + %br
  14 + .actions
  15 + = submit_tag 'Save', class: "btn primary"
  16 + = link_to 'Cancel', :back, class: "btn"
app/views/teams/projects/edit.html.haml
1 = render "teams/team_head" 1 = render "teams/team_head"
2 2
3 -%h1 Teams::Projects#edit  
4 -%p Find me in app/views/teams/projects/edit.html.haml 3 +%h3
  4 + Edit max access in #{@project.name} for #{@team.name} team
  5 +
  6 +%hr
  7 +%table.zebra-striped
  8 + %tr
  9 + %td Project:
  10 + %td= @project.name
  11 + %tr
  12 + %td Team:
  13 + %td= @team.name
  14 + %tr
  15 + %td Since:
  16 + %td= assigned_since(@team, @project).stamp("Nov 11, 2010")
  17 +
  18 += render 'form'
app/views/teams/projects/index.html.haml
1 = render "teams/team_head" 1 = render "teams/team_head"
2 2
3 -%fieldset  
4 - %legend Projects (#{@user_team.projects.count})  
5 - = form_tag delegate_projects_team_path(@user_team), id: "team_projects", class: "bulk_import", method: :post do  
6 - %table  
7 - %thead  
8 - %tr  
9 - %th Project name  
10 - %th Max access  
11 - %th  
12 - - @user_team.projects.each do |project|  
13 - %tr.project  
14 - %td  
15 - = link_to project.name_with_namespace, project  
16 - %td  
17 - %span= @user_team.human_max_project_access(project)  
18 - -# if current_user.can?(:manage_user_team, @user_team)  
19 - - relation = project.user_team_project_relationships.find_by_user_team_id(@user_team)  
20 - = form_for(relation, as: :project, url: team_project_path(@user_team, project)) do |f|  
21 - = f.select :greatest_access, options_for_select(UsersProject.access_roles, @user_team.max_project_access(project)), {}, class: "medium project-access-select span2" 3 +%h3.page_title
  4 + Assigned projects (#{@team.projects.count})
  5 + %small
  6 + Read more about project permissions
  7 + %strong= link_to "here", help_permissions_path, class: "vlink"
22 8
23 - - if current_user.can?(:admin_user_team, @user_team)  
24 - %td.bgred  
25 - -#= link_to 'Edit max access', edit_project_team_path(@user_team, project), class: "btn small"  
26 - = link_to 'Relegate', relegate_project_team_path(@user_team, project_id: project.id), confirm: 'Remove project from team and move to global namespace. Are you sure?', method: :delete, class: "btn danger small"  
27 - - else  
28 - %td 9 + - if current_user.can?(:manage_user_team, @team) && @avaliable_projects.any?
  10 + %span.right
  11 + = link_to new_team_project_path(@team), class: "btn success small grouped", title: "New Team Member" do
  12 + Assign project to Team
29 13
30 - - if @avaliable_projects.any?  
31 - %tr  
32 - %td= select_tag :project_ids, options_from_collection_for_select(@avaliable_projects , :id, :name_with_namespace), multiple: true, data: {placeholder: 'Select projects'}, class: 'chosen span5'  
33 - %td= select_tag :greatest_project_access, options_for_select(Project.access_options), {class: "project-access-select chosen span3" }  
34 - %td= submit_tag 'Add', class: "btn primary" 14 +%hr
  15 +
  16 +%table
  17 + %thead
  18 + %tr
  19 + %th Project name
  20 + %th Max access
  21 + - if current_user.can?(:admin_user_team, @team)
  22 + %th.span3
  23 +
  24 + - @team.projects.each do |project|
  25 + %tr.project
  26 + %td
  27 + = link_to project.name_with_namespace, project_path(project)
  28 + %td
  29 + %span= @team.human_max_project_access(project)
  30 +
  31 + - if current_user.can?(:admin_user_team, @team)
  32 + %td.bgred
  33 + = link_to 'Edit max access', edit_team_project_path(@team, project), class: "btn small"
  34 + = link_to 'Relegate', team_project_path(@team, project), confirm: 'Remove project from team and move to global namespace. Are you sure?', method: :delete, class: "btn danger small"
app/views/teams/projects/new.html.haml
1 = render "teams/team_head" 1 = render "teams/team_head"
2 2
3 -%h1 Teams::Projects#new  
4 -%p Find me in app/views/teams/projects/new.html.haml 3 +%h3.page_title
  4 + Team: #{@team.name}
  5 +
  6 +%fieldset
  7 + %legend Projects (#{@team.projects.count})
  8 + = form_tag team_projects_path(@team), id: "assign_projects", class: "bulk_import", method: :post do
  9 + %table#projects_list
  10 + %thead
  11 + %tr
  12 + %th Project name
  13 + %th Max access
  14 + %th
  15 + - @team.projects.each do |project|
  16 + %tr.project
  17 + %td
  18 + = link_to project.name_with_namespace, team_project_path(@team, project)
  19 + %td
  20 + %span= @team.human_max_project_access(project)
  21 + %td
  22 + %tr
  23 + %td= select_tag :project_ids, options_from_collection_for_select(@avaliable_projects , :id, :name_with_namespace), multiple: true, data: {placeholder: 'Select projects'}, class: 'chosen span5'
  24 + %td= select_tag :greatest_project_access, options_for_select(UserTeam.access_roles), {class: "project-access-select chosen span3" }
  25 + %td= submit_tag 'Add', class: "btn primary", id: :assign_projects_to_team
app/views/teams/projects/show.html.haml
@@ -1,4 +0,0 @@ @@ -1,4 +0,0 @@
1 -= render "teams/team_head"  
2 -  
3 -%h1 Teams::Projects#edit  
4 -%p Find me in app/views/teams/projects/edit.html.haml  
app/views/teams/search.html.haml
1 = render "team_head" 1 = render "team_head"
2 2
3 -= form_tag search_team_path(@user_team), method: :get, class: 'form-inline' do |f| 3 += form_tag search_team_path(@team), method: :get, class: 'form-inline' do |f|
4 .padded 4 .padded
5 = label_tag :search do 5 = label_tag :search do
6 %strong Looking for 6 %strong Looking for