diff --git a/app/controllers/projects/team_members_controller.rb b/app/controllers/projects/team_members_controller.rb index b4b318fa59e..2c40b3c75f2 100644 --- a/app/controllers/projects/team_members_controller.rb +++ b/app/controllers/projects/team_members_controller.rb @@ -1,6 +1,6 @@ class Projects::TeamMembersController < Projects::ApplicationController # Authorize - before_filter :authorize_admin_project! + before_filter :authorize_admin_project!, except: :leave layout "project_settings" @@ -45,6 +45,15 @@ class Projects::TeamMembersController < Projects::ApplicationController end end + def leave + project.users_projects.find_by_user_id(current_user).destroy + + respond_to do |format| + format.html { redirect_to :back } + format.js { render nothing: true } + end + end + def apply_import giver = Project.find(params[:source_project_id]) status = @project.team.import(giver) diff --git a/app/models/project.rb b/app/models/project.rb index 6b8e54d5b22..b5dc2490359 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -317,7 +317,7 @@ class Project < ActiveRecord::Base mrs = self.merge_requests.opened.by_branch(branch_name).all # Update code for merge requests between project and project fork mrs += self.fork_merge_requests.opened.by_branch(branch_name).all - + mrs.each { |merge_request| merge_request.reload_code; merge_request.mark_as_unchecked } # Close merge requests @@ -447,4 +447,8 @@ class Project < ActiveRecord::Base order('id DESC').limit(100). update_all(updated_at: Time.now) end + + def project_member(user) + users_projects.where(user_id: user).first + end end diff --git a/app/models/user.rb b/app/models/user.rb index 52d6aa38e2e..ce8c88ca69e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -395,4 +395,9 @@ class User < ActiveRecord::Base self end + + def can_leave_project?(project) + project.namespace != namespace && + project.project_member(self) + end end diff --git a/app/views/dashboard/projects.html.haml b/app/views/dashboard/projects.html.haml index 785eb613334..904ac2d00a2 100644 --- a/app/views/dashboard/projects.html.haml +++ b/app/views/dashboard/projects.html.haml @@ -54,7 +54,7 @@ .span9 %ul.bordered-list.my-projects.top-list - @projects.each do |project| - %li + %li.my-project-row %h4.project-title = link_to project_path(project), class: dom_class(project) do = project.name_with_namespace @@ -63,6 +63,12 @@ = public_icon Public + - if current_user.can_leave_project?(project) + .pull-right + = link_to leave_project_team_members_path(project), confirm: "Leave project?", method: :delete, remote: true, class: "btn-tiny btn remove-row", title: 'Leave project' do + %i.icon-signout + Leave + - if project.forked_from_project %small.pull-right %i.icon-code-fork @@ -80,6 +86,7 @@ %span.light Last activity: %span.date= project_last_activity(project) + - if @projects.blank? %li %h3.nothing_here_message There are no projects here. diff --git a/config/routes.rb b/config/routes.rb index 8f1758394b6..58bbd2b650e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -288,6 +288,7 @@ Gitlab::Application.routes.draw do resources :team_members, except: [:index, :edit], constraints: { id: /[a-zA-Z.\/0-9_\-#%+]+/ } do collection do + delete :leave # Used for import team # from another project