From ea6f46cb87c7ba8c0c620a8ff954f203b3276a7c Mon Sep 17 00:00:00 2001 From: Andrey Kumanyaev Date: Sat, 19 Jan 2013 21:47:08 +0400 Subject: [PATCH] Team members public section --- app/controllers/teams/members_controller.rb | 58 ++++++++++++++++++++ app/views/teams/members/_form.html.haml | 23 ++++++++ app/views/teams/members/_show.html.haml | 31 +++++++++++ app/views/teams/members/_team.html.haml | 16 ++++++ app/views/teams/members/index.html.haml | 18 +++++++ app/views/teams/members/new.html.haml | 2 + app/views/teams/members/show.html.haml | 60 +++++++++++++++++++++ config/routes.rb | 4 ++ 8 files changed, 212 insertions(+) create mode 100644 app/controllers/teams/members_controller.rb create mode 100644 app/views/teams/members/_form.html.haml create mode 100644 app/views/teams/members/_show.html.haml create mode 100644 app/views/teams/members/_team.html.haml create mode 100644 app/views/teams/members/index.html.haml create mode 100644 app/views/teams/members/new.html.haml create mode 100644 app/views/teams/members/show.html.haml diff --git a/app/controllers/teams/members_controller.rb b/app/controllers/teams/members_controller.rb new file mode 100644 index 00000000..ab1c2878 --- /dev/null +++ b/app/controllers/teams/members_controller.rb @@ -0,0 +1,58 @@ +class Teams::MembersController < Teams::ApplicationController + # Authorize + before_filter :authorize_manage_user_team!, only: [:new, :edit] + + def index + @members = @user_team.members + end + + def show + @team_member = @user_team.members.find(params[:id]) + @events = @team_member.recent_events.limit(7) + end + + def new + @team_member = @user_team.members.new + end + + def create + users = User.where(id: params[:user_ids]) + + @project.team << [users, params[:default_project_access]] + + if params[:redirect_to] + redirect_to params[:redirect_to] + else + redirect_to project_team_index_path(@project) + end + end + + def update + @team_member = @user_team.members.find(params[:id]) + @team_member.update_attributes(params[:team_member]) + + unless @team_member.valid? + flash[:alert] = "User should have at least one role" + end + redirect_to team_member_path(@project) + end + + def destroy + @team_member = project.users_projects.find(params[:id]) + @team_member.destroy + + respond_to do |format| + format.html { redirect_to project_team_index_path(@project) } + format.js { render nothing: true } + end + end + + def apply_import + giver = Project.find(params[:source_project_id]) + status = @project.team.import(giver) + notice = status ? "Succesfully imported" : "Import failed" + + redirect_to project_team_members_path(project), notice: notice + end + +end diff --git a/app/views/teams/members/_form.html.haml b/app/views/teams/members/_form.html.haml new file mode 100644 index 00000000..a963e462 --- /dev/null +++ b/app/views/teams/members/_form.html.haml @@ -0,0 +1,23 @@ +%h3.page_title + = "New Team member(s)" +%hr += form_for @team_member, as: :team_member, url: project_team_members_path(@project, @team_member) do |f| + -if @team_member.errors.any? + .alert-message.block-message.error + %ul + - @team_member.errors.full_messages.each do |msg| + %li= msg + + %h6 1. Choose people you want in the team + .clearfix + = f.label :user_ids, "People" + .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}) + + %h6 2. Set access level for them + .clearfix + = f.label :project_access, "Project Access" + .input= select_tag :project_access, options_for_select(Project.access_options, @team_member.project_access), class: "project-access-select chosen" + + .actions + = f.submit 'Save', class: "btn save-btn" + = link_to "Cancel", project_team_index_path(@project), class: "btn cancel-btn" diff --git a/app/views/teams/members/_show.html.haml b/app/views/teams/members/_show.html.haml new file mode 100644 index 00000000..dfe73c77 --- /dev/null +++ b/app/views/teams/members/_show.html.haml @@ -0,0 +1,31 @@ +- user = member.user +- allow_admin = can? current_user, :manage_user_team, @user_team +%li{id: dom_id(member), class: "team_member_row user_#{user.id}"} + .row + .span5 + = link_to team_member_path(@user_team, user), title: user.name, class: "dark" do + = image_tag gravatar_icon(user.email, 40), class: "avatar s32" + = link_to team_member_path(@user_team, user), title: user.name, class: "dark" do + %strong= truncate(user.name, lenght: 40) + %br + %small.cgray= user.email + + .span6.right + - if allow_admin + .left.span2 + = form_for(member, as: :team_member, url: team_member_path(@user_team, user)) do |f| + = f.select :permission, options_for_select(UsersProject.access_roles, @user_team.default_projects_access(user)), {}, class: "medium project-access-select span2" + .left.span2 + %span + Admin access + = check_box_tag :group_admin + .right + - if current_user == user + %span.btn.disabled This is you! + - if @user_team.owner == user + %span.btn.disabled.success Owner + - elsif user.blocked + %span.btn.disabled.blocked Blocked + - elsif allow_admin + = link_to team_member_path(@user_team, user), confirm: remove_from_team_message(@user_team, user), method: :delete, class: "very_small btn danger" do + %i.icon-minus.icon-white diff --git a/app/views/teams/members/_team.html.haml b/app/views/teams/members/_team.html.haml new file mode 100644 index 00000000..e1fbf6d1 --- /dev/null +++ b/app/views/teams/members/_team.html.haml @@ -0,0 +1,16 @@ +- grouped_user_team_members(@user_team).each do |access, members| + .ui-box + %h5.title + = Project.access_options.key(access).pluralize + %small= members.size + %ul.well-list + - members.sort_by(&:user_name).each do |up| + = render(partial: 'teams/members/show', locals: {member: up}) + + +:javascript + $(function(){ + $('.repo-access-select, .project-access-select').live("change", function() { + $(this.form).submit(); + }); + }) diff --git a/app/views/teams/members/index.html.haml b/app/views/teams/members/index.html.haml new file mode 100644 index 00000000..5b125b32 --- /dev/null +++ b/app/views/teams/members/index.html.haml @@ -0,0 +1,18 @@ += render "teams/team_head" +%h3.page_title + Team Members + (#{@members.count}) + %small + Read more about project permissions + %strong= link_to "here", help_permissions_path, class: "vlink" + + - if can? current_user, :manage_user_team, @user_team + %span.right + = link_to new_team_member_path(@user_team), class: "btn success small grouped", title: "New Team Member" do + New Team Member +%hr + + +.clearfix +%div.team-table + = render partial: "teams/members/team", locals: {project: @user_team} diff --git a/app/views/teams/members/new.html.haml b/app/views/teams/members/new.html.haml new file mode 100644 index 00000000..40eb4ceb --- /dev/null +++ b/app/views/teams/members/new.html.haml @@ -0,0 +1,2 @@ += render "projects/project_head" += render "team_members/form" diff --git a/app/views/teams/members/show.html.haml b/app/views/teams/members/show.html.haml new file mode 100644 index 00000000..4008e8bd --- /dev/null +++ b/app/views/teams/members/show.html.haml @@ -0,0 +1,60 @@ +- allow_admin = can? current_user, :admin_project, @project +- user = @team_member.user + +.team_member_show + - if can? current_user, :admin_project, @project + = 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" + .profile_avatar_holder + = image_tag gravatar_icon(user.email, 60), class: "borders" + %h3.page_title + = user.name + %small (@#{user.username}) + + %hr + .back_link + %br + = link_to project_team_index_path(@project), class: "" do + ← To team list + %br + .row + .span6 + %table.lite + %tr + %td Email + %td= mail_to user.email + %tr + %td Skype + %td= user.skype + - unless user.linkedin.blank? + %tr + %td LinkedIn + %td= user.linkedin + - unless user.twitter.blank? + %tr + %td Twitter + %td= user.twitter + - unless user.bio.blank? + %tr + %td Bio + %td= user.bio + .span6 + %table.lite + %tr + %td Member since + %td= @team_member.created_at.stamp("Aug 21, 2011") + %tr + %td + Project Access: + %small (#{link_to "read more", help_permissions_path, class: "vlink"}) + %td + = form_for(@team_member, as: :team_member, url: project_team_member_path(@project, @team_member)) do |f| + = f.select :project_access, options_for_select(Project.access_options, @team_member.project_access), {}, class: "project-access-select", disabled: !allow_admin + %hr + = render @events +:javascript + $(function(){ + $('.repo-access-select, .project-access-select').live("change", function() { + $(this.form).submit(); + }); + }) + diff --git a/config/routes.rb b/config/routes.rb index 4a6b0d0b..44678ca0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -139,6 +139,10 @@ Gitlab::Application.routes.draw do delete :relegate_project put :update_access end + scope module: :teams do + resources :members + end + end collection do get :search end