mirror of
https://github.com/meineerde/redmine.git
synced 2025-12-19 15:01:14 +00:00
Moved new project member to its own action MemberController#new.
git-svn-id: http://svn.redmine.org/redmine/trunk@13600 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
f21a005fea
commit
36fc7beb2f
@ -17,9 +17,9 @@
|
|||||||
|
|
||||||
class MembersController < ApplicationController
|
class MembersController < ApplicationController
|
||||||
model_object Member
|
model_object Member
|
||||||
before_filter :find_model_object, :except => [:index, :create, :autocomplete]
|
before_filter :find_model_object, :except => [:index, :new, :create, :autocomplete]
|
||||||
before_filter :find_project_from_association, :except => [:index, :create, :autocomplete]
|
before_filter :find_project_from_association, :except => [:index, :new, :create, :autocomplete]
|
||||||
before_filter :find_project_by_project_id, :only => [:index, :create, :autocomplete]
|
before_filter :find_project_by_project_id, :only => [:index, :new, :create, :autocomplete]
|
||||||
before_filter :authorize
|
before_filter :authorize
|
||||||
accept_api_auth :index, :show, :create, :update, :destroy
|
accept_api_auth :index, :show, :create, :update, :destroy
|
||||||
|
|
||||||
@ -46,6 +46,10 @@ class MembersController < ApplicationController
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def new
|
||||||
|
@member = Member.new
|
||||||
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
members = []
|
members = []
|
||||||
if params[:membership]
|
if params[:membership]
|
||||||
|
|||||||
@ -19,12 +19,15 @@
|
|||||||
|
|
||||||
module MembersHelper
|
module MembersHelper
|
||||||
def render_principals_for_new_members(project)
|
def render_principals_for_new_members(project)
|
||||||
scope = Principal.visible.sorted.not_member_of(project).like(params[:q])
|
scope = Principal.active.visible.sorted.not_member_of(project).like(params[:q])
|
||||||
principal_count = scope.count
|
principal_count = scope.count
|
||||||
principal_pages = Redmine::Pagination::Paginator.new principal_count, 100, params['page']
|
principal_pages = Redmine::Pagination::Paginator.new principal_count, 100, params['page']
|
||||||
principals = scope.offset(principal_pages.offset).limit(principal_pages.per_page).to_a
|
principals = scope.offset(principal_pages.offset).limit(principal_pages.per_page).to_a
|
||||||
|
|
||||||
s = content_tag('div', principals_check_box_tags('membership[user_ids][]', principals), :id => 'principals')
|
s = content_tag('div',
|
||||||
|
content_tag('div', principals_check_box_tags('membership[user_ids][]', principals), :id => 'principals'),
|
||||||
|
:class => 'objects-selection'
|
||||||
|
)
|
||||||
|
|
||||||
links = pagination_links_full(principal_pages, principal_count, :per_page_links => false) {|text, parameters, options|
|
links = pagination_links_full(principal_pages, principal_count, :per_page_links => false) {|text, parameters, options|
|
||||||
link_to text, autocomplete_project_memberships_path(project, parameters.merge(:q => params[:q], :format => 'js')), :remote => true
|
link_to text, autocomplete_project_memberships_path(project, parameters.merge(:q => params[:q], :format => 'js')), :remote => true
|
||||||
|
|||||||
16
app/views/members/_new_form.html.erb
Normal file
16
app/views/members/_new_form.html.erb
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<fieldset class="box">
|
||||||
|
<legend><%= label_tag("principal_search", l(:label_principal_search)) %></legend>
|
||||||
|
<p><%= text_field_tag('principal_search', nil) %></p>
|
||||||
|
<%= javascript_tag "observeSearchfield('principal_search', null, '#{ escape_javascript autocomplete_project_memberships_path(@project, :format => 'js') }')" %>
|
||||||
|
<div id="principals_for_new_member">
|
||||||
|
<%= render_principals_for_new_members(@project) %>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
<fieldset class="box">
|
||||||
|
<legend><%= l(:label_role_plural) %> <%= toggle_checkboxes_link('.roles-selection input') %></legend>
|
||||||
|
<div class="roles-selection">
|
||||||
|
<% Role.givable.all.each do |role| %>
|
||||||
|
<label><%= check_box_tag 'membership[role_ids][]', role.id, false, :id => nil %> <%= role %></label>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
9
app/views/members/_new_modal.html.erb
Normal file
9
app/views/members/_new_modal.html.erb
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<h3 class="title"><%= l(:label_member_new) %></h3>
|
||||||
|
|
||||||
|
<%= form_for @member, :as => :membership, :url => project_memberships_path(@project), :remote => true, :method => :post do |f| %>
|
||||||
|
<%= render :partial => 'new_form' %>
|
||||||
|
<p class="buttons">
|
||||||
|
<%= submit_tag l(:button_add), :id => 'member-add-submit' %>
|
||||||
|
<%= submit_tag l(:button_cancel), :name => nil, :onclick => "hideModal(this);", :type => 'button' %>
|
||||||
|
</p>
|
||||||
|
<% end %>
|
||||||
@ -2,10 +2,11 @@ $('#tab-content-members').html('<%= escape_javascript(render :partial => 'projec
|
|||||||
hideOnLoad();
|
hideOnLoad();
|
||||||
|
|
||||||
<% if @members.present? && @members.all? {|m| m.valid? } %>
|
<% if @members.present? && @members.all? {|m| m.valid? } %>
|
||||||
|
hideModal();
|
||||||
<% @members.each do |member| %>
|
<% @members.each do |member| %>
|
||||||
$("#member-<%= member.id %>").effect("highlight");
|
$("#member-<%= member.id %>").effect("highlight");
|
||||||
<% end %>
|
<% end %>
|
||||||
<% else %>
|
<% elsif @members.present? %>
|
||||||
<% errors = @members.collect {|m| m.errors.full_messages}.flatten.uniq.join(', ') %>
|
<% errors = @members.collect {|m| m.errors.full_messages}.flatten.uniq.join(', ') %>
|
||||||
alert('<%= raw(escape_javascript(l(:notice_failed_to_save_members, :errors => errors))) %>');
|
alert('<%= raw(escape_javascript(l(:notice_failed_to_save_members, :errors => errors))) %>');
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
6
app/views/members/new.html.erb
Normal file
6
app/views/members/new.html.erb
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<h2><%= l(:label_member_new) %></h2>
|
||||||
|
|
||||||
|
<%= form_for @member, :as => :membership, :url => project_memberships_path(@project), :method => :post do |f| %>
|
||||||
|
<%= render :partial => 'new_form' %>
|
||||||
|
<p><%= submit_tag l(:button_add), :name => nil %></p>
|
||||||
|
<% end %>
|
||||||
2
app/views/members/new.js.erb
Normal file
2
app/views/members/new.js.erb
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
$('#ajax-modal').html('<%= escape_javascript(render :partial => 'members/new_modal') %>');
|
||||||
|
showModal('ajax-modal', '700px');
|
||||||
@ -1,6 +1,6 @@
|
|||||||
<fieldset class="box">
|
<fieldset class="box">
|
||||||
<legend><%= l(:label_project_plural) %> <%= toggle_checkboxes_link('.projects-selection input:enabled') %></legend>
|
<legend><%= l(:label_project_plural) %> <%= toggle_checkboxes_link('.projects-selection input:enabled') %></legend>
|
||||||
<div style="max-height:300px; overflow:auto;">
|
<div class="objects-selection">
|
||||||
<div class="projects-selection">
|
<div class="projects-selection">
|
||||||
<%= render_project_nested_lists(@projects) do |p| %>
|
<%= render_project_nested_lists(@projects) do |p| %>
|
||||||
<label>
|
<label>
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
<%= error_messages_for 'member' %>
|
|
||||||
<% roles = Role.find_all_givable
|
<% roles = Role.find_all_givable
|
||||||
members = @project.member_principals.includes(:member_roles, :roles, :principal).to_a.sort %>
|
members = @project.member_principals.includes(:member_roles, :roles, :principal).to_a.sort %>
|
||||||
|
|
||||||
<div class="splitcontentleft">
|
<p><%= link_to l(:label_member_new), new_project_membership_path(@project), :remote => true, :class => "icon icon-add" %></p>
|
||||||
|
|
||||||
<% if members.any? %>
|
<% if members.any? %>
|
||||||
<table class="list members">
|
<table class="list members">
|
||||||
<thead>
|
<thead>
|
||||||
@ -62,31 +62,3 @@
|
|||||||
<% else %>
|
<% else %>
|
||||||
<p class="nodata"><%= l(:label_no_data) %></p>
|
<p class="nodata"><%= l(:label_no_data) %></p>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="splitcontentright">
|
|
||||||
<% if roles.any? %>
|
|
||||||
<%= form_for(@member,
|
|
||||||
{:as => :membership, :url => project_memberships_path(@project),
|
|
||||||
:remote => true, :method => :post}) do |f| %>
|
|
||||||
<fieldset>
|
|
||||||
<legend><%=l(:label_member_new)%></legend>
|
|
||||||
<p>
|
|
||||||
<%= label_tag("principal_search", l(:label_principal_search)) %>
|
|
||||||
<%= text_field_tag('principal_search', nil) %>
|
|
||||||
</p>
|
|
||||||
<%= javascript_tag "observeSearchfield('principal_search', null, '#{ escape_javascript autocomplete_project_memberships_path(@project, :format => 'js') }')" %>
|
|
||||||
<div id="principals_for_new_member">
|
|
||||||
<%= render_principals_for_new_members(@project) %>
|
|
||||||
</div>
|
|
||||||
<p>
|
|
||||||
<%= l(:label_role_plural) %>:
|
|
||||||
<% roles.each do |role| %>
|
|
||||||
<label><%= check_box_tag 'membership[role_ids][]', role.id, false, :id => nil %> <%= role %></label>
|
|
||||||
<% end %>
|
|
||||||
</p>
|
|
||||||
<p><%= submit_tag l(:button_add), :id => 'member-add-submit' %></p>
|
|
||||||
</fieldset>
|
|
||||||
<% end %>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
|
|||||||
@ -82,7 +82,7 @@ Redmine::AccessControl.map do |map|
|
|||||||
map.permission :close_project, {:projects => [:close, :reopen]}, :require => :member, :read => true
|
map.permission :close_project, {:projects => [:close, :reopen]}, :require => :member, :read => true
|
||||||
map.permission :select_project_modules, {:projects => :modules}, :require => :member
|
map.permission :select_project_modules, {:projects => :modules}, :require => :member
|
||||||
map.permission :view_members, {:members => [:index, :show]}, :public => true, :read => true
|
map.permission :view_members, {:members => [:index, :show]}, :public => true, :read => true
|
||||||
map.permission :manage_members, {:projects => :settings, :members => [:index, :show, :create, :update, :destroy, :autocomplete]}, :require => :member
|
map.permission :manage_members, {:projects => :settings, :members => [:index, :show, :new, :create, :update, :destroy, :autocomplete]}, :require => :member
|
||||||
map.permission :manage_versions, {:projects => :settings, :versions => [:new, :create, :edit, :update, :close_completed, :destroy]}, :require => :member
|
map.permission :manage_versions, {:projects => :settings, :versions => [:new, :create, :edit, :update, :close_completed, :destroy]}, :require => :member
|
||||||
map.permission :add_subprojects, {:projects => [:new, :create]}, :require => :member
|
map.permission :add_subprojects, {:projects => [:new, :create]}, :require => :member
|
||||||
|
|
||||||
|
|||||||
@ -97,6 +97,7 @@ html>body #content { min-height: 600px; }
|
|||||||
div.modal { border-radius:5px; background:#fff; z-index:50; padding:4px;}
|
div.modal { border-radius:5px; background:#fff; z-index:50; padding:4px;}
|
||||||
div.modal h3.title {display:none;}
|
div.modal h3.title {display:none;}
|
||||||
div.modal p.buttons {text-align:right; margin-bottom:0;}
|
div.modal p.buttons {text-align:right; margin-bottom:0;}
|
||||||
|
div.modal .box p {margin: 0.3em 0;}
|
||||||
|
|
||||||
input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; }
|
input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; }
|
||||||
|
|
||||||
@ -599,14 +600,12 @@ select.bool_cf {width:auto !important;}
|
|||||||
|
|
||||||
#tab-content-modules fieldset p {margin:3px 0 4px 0;}
|
#tab-content-modules fieldset p {margin:3px 0 4px 0;}
|
||||||
|
|
||||||
#tab-content-members .splitcontentleft, #tab-content-memberships .splitcontentleft, #tab-content-users .splitcontentleft {width: 64%;}
|
#tab-content-users .splitcontentleft {width: 64%;}
|
||||||
#tab-content-members .splitcontentright, #tab-content-memberships .splitcontentright, #tab-content-users .splitcontentright {width: 34%;}
|
#tab-content-users .splitcontentright {width: 34%;}
|
||||||
#tab-content-members fieldset, #tab-content-memberships fieldset, #tab-content-users fieldset {padding:1em; margin-bottom: 1em;}
|
#tab-content-users fieldset {padding:1em; margin-bottom: 1em;}
|
||||||
#tab-content-members fieldset legend, #tab-content-memberships fieldset legend, #tab-content-users fieldset legend {font-weight: bold;}
|
#tab-content-users fieldset legend {font-weight: bold;}
|
||||||
#tab-content-members fieldset label, #tab-content-memberships fieldset label, #tab-content-users fieldset label {display: block;}
|
#tab-content-users fieldset label {display: block;}
|
||||||
#tab-content-members #principals, #tab-content-users #principals {max-height: 400px; overflow: auto;}
|
#tab-content-users #principals {max-height: 400px; overflow: auto;}
|
||||||
|
|
||||||
#tab-content-memberships .splitcontentright select {width:90%}
|
|
||||||
|
|
||||||
#users_for_watcher {height: 200px; overflow:auto;}
|
#users_for_watcher {height: 200px; overflow:auto;}
|
||||||
#users_for_watcher label {display: block;}
|
#users_for_watcher label {display: block;}
|
||||||
@ -626,7 +625,16 @@ input.autocomplete.ajax-loading {
|
|||||||
|
|
||||||
.role-visibility {padding-left:2em;}
|
.role-visibility {padding-left:2em;}
|
||||||
|
|
||||||
.projects-selection {
|
.objects-selection {
|
||||||
|
height: 300px;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.objects-selection label {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.objects-selection>div {
|
||||||
column-count: auto;
|
column-count: auto;
|
||||||
column-width: 200px;
|
column-width: 200px;
|
||||||
-webkit-column-count: auto;
|
-webkit-column-count: auto;
|
||||||
|
|||||||
@ -25,6 +25,17 @@ class MembersControllerTest < ActionController::TestCase
|
|||||||
@request.session[:user_id] = 2
|
@request.session[:user_id] = 2
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_new
|
||||||
|
get :new, :project_id => 1
|
||||||
|
assert_response :success
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_xhr_new
|
||||||
|
xhr :get, :new, :project_id => 1
|
||||||
|
assert_response :success
|
||||||
|
assert_equal 'text/javascript', response.content_type
|
||||||
|
end
|
||||||
|
|
||||||
def test_create
|
def test_create
|
||||||
assert_difference 'Member.count' do
|
assert_difference 'Member.count' do
|
||||||
post :create, :project_id => 1, :membership => {:role_ids => [1], :user_id => 7}
|
post :create, :project_id => 1, :membership => {:role_ids => [1], :user_id => 7}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user