diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb index 130b56c8..fcc65ba0 100644 --- a/app/controllers/members_controller.rb +++ b/app/controllers/members_controller.rb @@ -21,10 +21,26 @@ class MembersController < ApplicationController before_filter :authorize def new - @project.members << Member.new(params[:member]) if request.post? + members = [] + if params[:member] && request.post? + attrs = params[:member].dup + if (user_ids = attrs.delete(:user_ids)) + user_ids.each do |user_id| + members << Member.new(attrs.merge(:user_id => user_id)) + end + else + members << Member.new(attrs) + end + @project.members << members + end respond_to do |format| format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project } - format.js { render(:update) {|page| page.replace_html "tab-content-members", :partial => 'projects/settings/members'} } + format.js { + render(:update) {|page| + page.replace_html "tab-content-members", :partial => 'projects/settings/members' + members.each {|member| page.visual_effect(:highlight, "member-#{member.id}") } + } + } end end diff --git a/app/views/projects/settings/_members.rhtml b/app/views/projects/settings/_members.rhtml index 20806fe2..79ddeded 100644 --- a/app/views/projects/settings/_members.rhtml +++ b/app/views/projects/settings/_members.rhtml @@ -3,7 +3,8 @@ <% users = User.active.find(:all).sort - @project.users %> <% # members sorted by role position members = @project.members.find(:all, :include => [:role, :user]).sort %> - + +
<% if members.any? %> @@ -15,7 +16,7 @@ <% members.each do |member| %> <% next if member.new_record? %> - +
<%= member.name %> <% if authorize_for('members', 'edit') %> @@ -39,12 +40,20 @@ <% else %>

<%= l(:label_no_data) %>

<% end %> + -<% if authorize_for('members', 'new') && !users.empty? %> +
+<% if !users.empty? %> <% remote_form_for(:member, @member, :url => {:controller => 'members', :action => 'new', :id => @project}, :method => :post) do |f| %> -


- <%= f.select :user_id, users.collect{|user| [user.name, user.id]} %> - <%= l(:label_role) %>: <%= f.select :role_id, roles.collect{|role| [role.name, role.id]}, :selected => nil %> +

<%=l(:label_member_new)%> +
+ <% users.each do |user| -%> + + <% end -%> +
+

<%= l(:label_role) %>: <%= f.select :role_id, roles.collect{|role| [role.name, role.id]}, :selected => nil %> <%= submit_tag l(:button_add) %>

+
<% end %> <% end %> +
diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css index 843860f4..f156b5fc 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -324,6 +324,16 @@ p.other-formats { text-align: right; font-size:0.9em; color: #666; } a.atom { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; } +/* Project members tab */ +div#tab-content-members .splitcontentleft { width: 64% } +div#tab-content-members .splitcontentright { width: 34% } +div#tab-content-members fieldset { margin-top: -8px; padding-top:0.6em; margin-bottom: 1em; } +div#tab-content-members fieldset legend { font-weight: bold; } +div#tab-content-members fieldset label { display: block; } +div#tab-content-members fieldset div { max-height: 400px; overflow:auto; } + +* html div#tab-content-members fieldset div { height: 450px; } + /***** Flash & error messages ****/ #errorExplanation, div.flash, .nodata, .warning { padding: 4px 4px 4px 30px; diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index 50c1dce2..8be82284 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -112,5 +112,37 @@ users_007: mail_notification: false login: someone type: User +users_008: + id: 8 + created_on: 2006-07-19 19:33:19 +02:00 + status: 1 + last_login_on: + language: 'it' + hashed_password: 1 + updated_on: 2006-07-19 19:33:19 +02:00 + admin: false + mail: miscuser8@foo.bar + lastname: Misc + firstname: User + auth_source_id: + mail_notification: false + login: miscuser8 + type: User +users_009: + id: 9 + created_on: 2006-07-19 19:33:19 +02:00 + status: 1 + last_login_on: + language: 'it' + hashed_password: 1 + updated_on: 2006-07-19 19:33:19 +02:00 + admin: false + mail: miscuser9@foo.bar + lastname: Misc + firstname: User + auth_source_id: + mail_notification: false + login: miscuser9 + type: User \ No newline at end of file diff --git a/test/functional/members_controller_test.rb b/test/functional/members_controller_test.rb index c7868ae6..be3e6d1c 100644 --- a/test/functional/members_controller_test.rb +++ b/test/functional/members_controller_test.rb @@ -40,7 +40,7 @@ class MembersControllerTest < Test::Unit::TestCase ) end - def test_new + def test_create assert_difference 'Member.count' do post :new, :id => 1, :member => {:role_id => 1, :user_id => 7} end @@ -48,6 +48,14 @@ class MembersControllerTest < Test::Unit::TestCase assert User.find(7).member_of?(Project.find(1)) end + def test_create_multiple + assert_difference 'Member.count', 3 do + post :new, :id => 1, :member => {:role_id => 1, :user_ids => [7, 8, 9]} + end + assert_redirected_to '/projects/ecookbook/settings/members' + assert User.find(7).member_of?(Project.find(1)) + end + def test_edit assert_no_difference 'Member.count' do post :edit, :id => 2, :member => {:role_id => 1, :user_id => 3}