Commit ea6f46cb87c7ba8c0c620a8ff954f203b3276a7c

Authored by Andrey Kumanyaev
Committed by Dmitriy Zaporozhets
1 parent 360aa1b4

Team members public section

app/controllers/teams/members_controller.rb 0 → 100644
... ... @@ -0,0 +1,58 @@
  1 +class Teams::MembersController < Teams::ApplicationController
  2 + # Authorize
  3 + before_filter :authorize_manage_user_team!, only: [:new, :edit]
  4 +
  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)
  12 + end
  13 +
  14 + def new
  15 + @team_member = @user_team.members.new
  16 + end
  17 +
  18 + def create
  19 + users = User.where(id: params[:user_ids])
  20 +
  21 + @project.team << [users, params[:default_project_access]]
  22 +
  23 + if params[:redirect_to]
  24 + redirect_to params[:redirect_to]
  25 + else
  26 + redirect_to project_team_index_path(@project)
  27 + end
  28 + end
  29 +
  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"
  36 + end
  37 + redirect_to team_member_path(@project)
  38 + end
  39 +
  40 + 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 }
  47 + end
  48 + end
  49 +
  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"
  54 +
  55 + redirect_to project_team_members_path(project), notice: notice
  56 + end
  57 +
  58 +end
... ...
app/views/teams/members/_form.html.haml 0 → 100644
... ... @@ -0,0 +1,23 @@
  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?
  6 + .alert-message.block-message.error
  7 + %ul
  8 + - @team_member.errors.full_messages.each do |msg|
  9 + %li= msg
  10 +
  11 + %h6 1. Choose people you want in the team
  12 + .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
  17 + .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"
  20 +
  21 + .actions
  22 + = f.submit 'Save', class: "btn save-btn"
  23 + = link_to "Cancel", project_team_index_path(@project), class: "btn cancel-btn"
... ...
app/views/teams/members/_show.html.haml 0 → 100644
... ... @@ -0,0 +1,31 @@
  1 +- user = member.user
  2 +- allow_admin = can? current_user, :manage_user_team, @user_team
  3 +%li{id: dom_id(member), class: "team_member_row user_#{user.id}"}
  4 + .row
  5 + .span5
  6 + = link_to team_member_path(@user_team, user), title: user.name, class: "dark" do
  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
  9 + %strong= truncate(user.name, lenght: 40)
  10 + %br
  11 + %small.cgray= user.email
  12 +
  13 + .span6.right
  14 + - if allow_admin
  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"
  18 + .left.span2
  19 + %span
  20 + Admin access
  21 + = check_box_tag :group_admin
  22 + .right
  23 + - if current_user == user
  24 + %span.btn.disabled This is you!
  25 + - if @user_team.owner == user
  26 + %span.btn.disabled.success Owner
  27 + - elsif user.blocked
  28 + %span.btn.disabled.blocked Blocked
  29 + - elsif allow_admin
  30 + = link_to team_member_path(@user_team, user), confirm: remove_from_team_message(@user_team, user), method: :delete, class: "very_small btn danger" do
  31 + %i.icon-minus.icon-white
... ...
app/views/teams/members/_team.html.haml 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +- grouped_user_team_members(@user_team).each do |access, members|
  2 + .ui-box
  3 + %h5.title
  4 + = Project.access_options.key(access).pluralize
  5 + %small= members.size
  6 + %ul.well-list
  7 + - members.sort_by(&:user_name).each do |up|
  8 + = render(partial: 'teams/members/show', locals: {member: up})
  9 +
  10 +
  11 +:javascript
  12 + $(function(){
  13 + $('.repo-access-select, .project-access-select').live("change", function() {
  14 + $(this.form).submit();
  15 + });
  16 + })
... ...
app/views/teams/members/index.html.haml 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 += render "teams/team_head"
  2 +%h3.page_title
  3 + Team Members
  4 + (#{@members.count})
  5 + %small
  6 + Read more about project permissions
  7 + %strong= link_to "here", help_permissions_path, class: "vlink"
  8 +
  9 + - if can? current_user, :manage_user_team, @user_team
  10 + %span.right
  11 + = link_to new_team_member_path(@user_team), class: "btn success small grouped", title: "New Team Member" do
  12 + New Team Member
  13 +%hr
  14 +
  15 +
  16 +.clearfix
  17 +%div.team-table
  18 + = render partial: "teams/members/team", locals: {project: @user_team}
... ...
app/views/teams/members/new.html.haml 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 += render "projects/project_head"
  2 += render "team_members/form"
... ...
app/views/teams/members/show.html.haml 0 → 100644
... ... @@ -0,0 +1,60 @@
  1 +- allow_admin = can? current_user, :admin_project, @project
  2 +- user = @team_member.user
  3 +
  4 +.team_member_show
  5 + - if can? current_user, :admin_project, @project
  6 + = link_to 'Remove from team', project_team_member_path(project_id: @project, id: @team_member.id), confirm: 'Are you sure?', method: :delete, class: "right btn danger"
  7 + .profile_avatar_holder
  8 + = image_tag gravatar_icon(user.email, 60), class: "borders"
  9 + %h3.page_title
  10 + = user.name
  11 + %small (@#{user.username})
  12 +
  13 + %hr
  14 + .back_link
  15 + %br
  16 + = link_to project_team_index_path(@project), class: "" do
  17 + &larr; To team list
  18 + %br
  19 + .row
  20 + .span6
  21 + %table.lite
  22 + %tr
  23 + %td Email
  24 + %td= mail_to user.email
  25 + %tr
  26 + %td Skype
  27 + %td= user.skype
  28 + - unless user.linkedin.blank?
  29 + %tr
  30 + %td LinkedIn
  31 + %td= user.linkedin
  32 + - unless user.twitter.blank?
  33 + %tr
  34 + %td Twitter
  35 + %td= user.twitter
  36 + - unless user.bio.blank?
  37 + %tr
  38 + %td Bio
  39 + %td= user.bio
  40 + .span6
  41 + %table.lite
  42 + %tr
  43 + %td Member since
  44 + %td= @team_member.created_at.stamp("Aug 21, 2011")
  45 + %tr
  46 + %td
  47 + Project Access:
  48 + %small (#{link_to "read more", help_permissions_path, class: "vlink"})
  49 + %td
  50 + = form_for(@team_member, as: :team_member, url: project_team_member_path(@project, @team_member)) do |f|
  51 + = f.select :project_access, options_for_select(Project.access_options, @team_member.project_access), {}, class: "project-access-select", disabled: !allow_admin
  52 + %hr
  53 + = render @events
  54 +:javascript
  55 + $(function(){
  56 + $('.repo-access-select, .project-access-select').live("change", function() {
  57 + $(this.form).submit();
  58 + });
  59 + })
  60 +
... ...
config/routes.rb
... ... @@ -139,6 +139,10 @@ Gitlab::Application.routes.draw do
139 139 delete :relegate_project
140 140 put :update_access
141 141 end
  142 + scope module: :teams do
  143 + resources :members
  144 + end
  145 + end
142 146 collection do
143 147 get :search
144 148 end
... ...