diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 4967505a3..27c927ed8 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -479,6 +479,15 @@ module ApplicationHelper s.html_safe end + #扩展的checkbox生成 + def principals_check_box_tags_style_ex(name, principals) + s = '' + principals.each do |principal| + s << "\n" + end + s.html_safe + end + #扩展的checkbox生成 def principals_radio_box_tags_ex(name, principals) s = '' diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 3c7123435..14ddfa74a 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -46,6 +46,23 @@ module RepositoriesHelper end end + # 项目成员列表 + def render_principals_for_project(project) + scope = Principal.active.sorted.member_of(project).like(params[:q]) + principal_count = scope.count + principal_pages = Redmine::Pagination::Paginator.new principal_count, 10, params['page'] #by young + principals = scope.offset(principal_pages.offset).limit(principal_pages.per_page).all + + s = content_tag('div', principals_check_box_tags_style_ex('membership[user_ids][]', principals), :id => 'principals') + + 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 + } + + s + content_tag('div', content_tag('ul', links), :class => 'pagination_new') + end + + def render_changeset_changes changes = @changeset.filechanges.limit(1000).reorder('path').all.collect do |change| case change.action diff --git a/app/views/repositories/_gitlab_user_manage.html.erb b/app/views/repositories/_gitlab_user_manage.html.erb index 30cf76f8a..7fda90173 100644 --- a/app/views/repositories/_gitlab_user_manage.html.erb +++ b/app/views/repositories/_gitlab_user_manage.html.erb @@ -1,126 +1,103 @@ <%= error_messages_for 'member' %> <% + roles = Hash.new + roles[:GUEST] = GitlabHelper::GUEST + roles[:REPORTER] = GitlabHelper::REPORTER + roles[:DEVELOPER] = GitlabHelper::DEVELOPER + roles[:MASTER] = GitlabHelper::MASTER members = @project.members %>
-
- <% if members.any? %> - - - - - - - <%= call_hook(:view_projects_settings_members_table_header, :project => @project) %> - - - - <% members.each do |member| %> - <% next if member.new_record? %> - - - + + +
<%= l(:label_user) %><%= l(:label_role_plural) %>
<%= link_to_user member.principal %> + + + + <% if member.roles.first.to_s == "Manager" %> + + <% else %> + + <% end %> + <%= call_hook(:view_projects_settings_members_table_row, {:project => @project, :member => member}) %> + + <% end; reset_cycle %> + +
+
+ <% if members.any? %> + + + + + + + <%= call_hook(:view_projects_settings_members_table_header, :project => @project) %> + + + + <% members.each do |member| %> + <% next if member.new_record? %> + + + - <% if @project.project_type == 1 %> - <% if member.roles.first.to_s == "Manager" %> - - <% else %> - - <% end %> - <% else %> - - <% end %> - <%= call_hook(:view_projects_settings_members_table_row, {:project => @project, :member => member}) %> - - <% end; reset_cycle %> - -
<%= l(:label_user) %><%= l(:label_role_plural) %>
<%= link_to_user member.principal %> <%= h member.roles.sort.collect(&:to_s).join(', ') %> - <%= form_for(member, {:as => :membership, :remote => true, :url => membership_path(member), - :method => :put, - :html => {:id => "member-#{member.id}-roles-form", :class => 'hol'}} - ) do |f| %> + <%= form_for(member, {:as => :membership, :remote => true, :url => membership_path(member), + :method => :put, + :html => {:id => "member-#{member.id}-roles-form", :class => 'hol'}} + ) do |f| %> -

- <% roles.each do |role| %> -
- <% end %>

- <%= hidden_field_tag 'membership[role_ids][]', '' %> -

<%= submit_tag l(:button_change), :class => "small" %> - <%= link_to_function l(:button_cancel), - "$('#member-#{member.id}-roles').show(); $('#member-#{member.id}-roles-form').hide(); return false;" - %>

- <% end %> -
- <%= link_to_function l(:button_edit), - "$('#member-#{member.id}-roles').hide(); $('#member-#{member.id}-roles-form').show(); return false;", - :class => 'icon icon-edit' %> - <%= delete_link membership_path(member), - :remote => true, - :data => (!User.current.admin? && member.include?(User.current) ? {:confirm => l(:text_own_membership_delete_confirmation)} : {}) if member.deletable? %> - - <%= link_to_function l(:button_edit), - "$('#member-#{member.id}-roles').hide(); $('#member-#{member.id}-roles-form').show(); return false;", - :class => 'icon icon-edit' %> - <%= delete_link membership_path(member), - :remote => true, - :data => (!User.current.admin? && member.include?(User.current) ? {:confirm => l(:text_own_membership_delete_confirmation)} : {}) if member.deletable? %> -
- <% else %> -

<%= l(:label_no_data) %>

- <% end %> -
+

+ <% roles.each do |role| %> +
+ <% end %>

-
- <% if roles.any? %> - <% if @project.applied_projects.any? %> -
- <%= form_for(@applied_members, {:as => :membership, :url => project_memberships_path(@project), :remote => true, :method => :post}) do |f| %> +

<%= submit_tag l(:button_change), :class => "small" %> + <%= link_to_function l(:button_cancel), + "$('#member-#{member.id}-roles').show(); $('#member-#{member.id}-roles-form').hide(); return false;" + %>

+ <% end %> +
+ <%= link_to_function l(:button_edit), + "$('#member-#{member.id}-roles').hide(); $('#member-#{member.id}-roles-form').show(); return false;", + :class => 'icon icon-edit' %> + <%= delete_link membership_path(member), + :remote => true, + :data => (!User.current.admin? && member.include?(User.current) ? {:confirm => l(:text_own_membership_delete_confirmation)} : {}) if member.deletable? %> +
+ <% else %> +

<%= l(:label_no_data) %>

+ <% end %> + +
+
+ <% if roles.any? %> + <%= form_for(@member, {:as => :membership, :url => project_memberships_path(@project), :remote => true, :method => :post}) do |f| %>
- <%= l(:label_apply_project) %> + <%= l(:label_member_new) %> -
- <%= render_principals_for_applied_members(@project) %> +

<%= label_tag "principal_search", l(:label_principal_search) %><%= text_field_tag 'principal_search', nil %>

+ <%= javascript_tag "observeSearchfield('principal_search', null, '#{ escape_javascript autocomplete_project_memberships_path(@project, :format => 'js') }')" %> + +
+ <%= render_principals_for_project(@project) %>
-

<%= l(:label_role_plural) %>: <% roles.each do |role| %> - - +
<% end %>

-

<%= submit_tag l(:label_approve), :id => 'member-add-submit' %> - <%= submit_tag l(:label_refusal), :name => "refusal_button", :id => 'member-refusal-submit' %> -

+

<%= submit_tag l(:button_add), :id => 'member-add-submit' %>

<% end %> -
- <% end %> - - <%= form_for(@member, {:as => :membership, :url => project_memberships_path(@project), :remote => true, :method => :post}) do |f| %> -
- <%= l(:label_member_new) %> - -

<%= label_tag "principal_search", l(:label_principal_search) %><%= text_field_tag 'principal_search', nil %>

- <%= javascript_tag "observeSearchfield('principal_search', null, '#{ escape_javascript autocomplete_project_memberships_path(@project, :format => 'js') }')" %> + <% end %> + +
-
- <%= render_principals_for_new_members(@project) %> -
- -

<%= l(:label_role_plural) %>: - <% roles.each do |role| %> - - <% end %>

-

<%= submit_tag l(:button_add), :id => 'member-add-submit' %>

- - <% end %> - <% end %> -
diff --git a/app/views/repositories/committers.html.erb b/app/views/repositories/committers.html.erb index 36d82ba43..78862b921 100644 --- a/app/views/repositories/committers.html.erb +++ b/app/views/repositories/committers.html.erb @@ -3,27 +3,22 @@ <%= simple_format(l(:text_repository_usernames_mapping)) %> +<% if User.current.logged? && User.current.allowed_to?(:add_gitlab_user, @project)%>
- <%= link_to l(:label_message_new), + <%= link_to l(:label_gitlab_user_manage), "javascript:void(0);", - :class => 'icon icon-add', - :onclick => 'showAndScrollTo("gitlab-user-manager", "message_subject"); return false;' if User.current.logged? %> + :class => 'icon icon-edit', + :onclick => "$('#gitlab-user-manager').show(); return false;" if User.current.logged? %>
- +<% end %> <% if @committers.empty? %>

<%= l(:label_no_data) %>

diff --git a/config/locales/en.yml b/config/locales/en.yml index accb88591..633dd3e6d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1371,6 +1371,7 @@ en: label_gitlab_email: The email user to login gitlab label_gitlab_account: The account user to login gitlab label_gitlab_password: The password user to login gitlab + label_gitlab_user_manage: Gitlab user manage label_are_you_sure: Are you sure? label_how_commit_code: How to commit code: label_how_commit_code_chinese: Chinese diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 258895b1b..920cb9fce 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -1572,6 +1572,7 @@ zh: label_gitlab_account: 用户登录Gitlab的账号,推荐使用当前用户。注意:若当前用户已创建过版本库,则会使用老账号 label_gitlab_email: 用户登录Gitlab的邮件,推荐使用当前用户邮件 label_gitlab_password: 用户登录Gitlab的密码,推荐使用当前用户密码。注意:若当前用户已创建过版本库,则会使用老密码 + label_gitlab_user_manage: Gitlab用户管理 label_are_you_sure: 您确定要删除版本库吗?如果这是系统创建的Git库,将同时删除所有版本数据。 label_how_commit_code: 查看如何提交代码: label_how_commit_code_chinese: 中文 diff --git a/lib/redmine.rb b/lib/redmine.rb index 6215a04ba..bd60efe61 100644 --- a/lib/redmine.rb +++ b/lib/redmine.rb @@ -172,6 +172,8 @@ Redmine::AccessControl.map do |map| map.permission :view_issue_watchers, {}, :read => true map.permission :add_issue_watchers, {:watchers => [:new, :create, :append, :autocomplete_for_user]} map.permission :delete_issue_watchers, {:watchers => :destroy} + + map.permission :add_gitlab_user, {:repositories => :committers}, :require => :loggedin end map.project_module :time_tracking do |map|