summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2019-03-15 10:09:28 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2019-03-15 10:09:28 +0000
commitb4c23f066e71978f36d8bd4aeae02be11385fcca (patch)
tree3555bb21efc0778859ea316c0a567f89c474502d
parent5da9cc59ee48b8e86b2836909ddff970cce76545 (diff)
downloadredmine-b4c23f066e71978f36d8bd4aeae02be11385fcca.tar.gz
redmine-b4c23f066e71978f36d8bd4aeae02be11385fcca.zip
Display details about inheritance when editing a member roles (#31032).
git-svn-id: http://svn.redmine.org/redmine/trunk@17968 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--app/controllers/principal_memberships_controller.rb2
-rw-r--r--app/helpers/members_helper.rb15
-rw-r--r--app/models/member.rb10
-rw-r--r--app/models/member_role.rb5
-rw-r--r--app/views/members/_edit.html.erb3
-rw-r--r--app/views/principal_memberships/_edit.html.erb11
-rw-r--r--config/locales/en.yml2
-rw-r--r--config/locales/fr.yml3
-rw-r--r--public/stylesheets/application.css5
9 files changed, 49 insertions, 7 deletions
diff --git a/app/controllers/principal_memberships_controller.rb b/app/controllers/principal_memberships_controller.rb
index 68770628f..a803a20b1 100644
--- a/app/controllers/principal_memberships_controller.rb
+++ b/app/controllers/principal_memberships_controller.rb
@@ -21,6 +21,8 @@ class PrincipalMembershipsController < ApplicationController
layout 'admin'
self.main_menu = false
+ helper :members
+
before_action :require_admin
before_action :find_principal, :only => [:new, :create]
before_action :find_membership, :only => [:edit, :update, :destroy]
diff --git a/app/helpers/members_helper.rb b/app/helpers/members_helper.rb
index 54ff8eb87..971c43fb1 100644
--- a/app/helpers/members_helper.rb
+++ b/app/helpers/members_helper.rb
@@ -37,4 +37,19 @@ module MembersHelper
s + content_tag('span', links, :class => 'pagination')
end
+
+ # Returns inheritance information for an inherited member role
+ def render_role_inheritance(member, role)
+ content = member.role_inheritance(role).map do |h|
+ if h.is_a?(Project)
+ l(:label_inherited_from_parent_project)
+ elsif h.is_a?(Group)
+ l(:label_inherited_from_group, :name => h.name.to_s)
+ end
+ end.compact.uniq
+
+ if content.present?
+ content_tag('span', content.join(", "), :class => "info")
+ end
+ end
end
diff --git a/app/models/member.rb b/app/models/member.rb
index 02f019402..c9c5c2d54 100644
--- a/app/models/member.rb
+++ b/app/models/member.rb
@@ -110,6 +110,16 @@ class Member < ActiveRecord::Base
member_roles.any? {|mr| mr.role_id == role.id && mr.inherited_from.present?}
end
+ # Returns an Array of Project and/or Group from which the given role
+ # was inherited, or an empty Array if the role was not inherited
+ def role_inheritance(role)
+ member_roles.
+ select {|mr| mr.role_id == role.id && mr.inherited_from.present?}.
+ map {|mr| mr.inherited_from_member_role.try(:member)}.
+ compact.
+ map {|m| m.project == project ? m.principal : m.project}
+ end
+
# Returns true if the member's role is editable by user
def role_editable?(role, user=User.current)
if has_inherited_role?(role)
diff --git a/app/models/member_role.rb b/app/models/member_role.rb
index fa49671d2..41734af26 100644
--- a/app/models/member_role.rb
+++ b/app/models/member_role.rb
@@ -37,6 +37,11 @@ class MemberRole < ActiveRecord::Base
!inherited_from.nil?
end
+ # Returns the MemberRole from which self was inherited, or nil
+ def inherited_from_member_role
+ MemberRole.find_by_id(inherited_from) if inherited_from
+ end
+
# Destroys the MemberRole without destroying its Member if it doesn't have
# any other roles
def destroy_without_member_removal
diff --git a/app/views/members/_edit.html.erb b/app/views/members/_edit.html.erb
index 91c340fec..e3c5ec747 100644
--- a/app/views/members/_edit.html.erb
+++ b/app/views/members/_edit.html.erb
@@ -9,12 +9,13 @@
role.id, @member.roles.to_a.include?(role),
:id => nil,
:disabled => !@member.role_editable?(role)) %> <%= role %>
+ <%= render_role_inheritance(@member, role) %>
</label><br />
<% end %>
</p>
<%= hidden_field_tag 'membership[role_ids][]', '', :id => nil %>
<p>
- <%= submit_tag l(:button_save), :class => "small" %>
+ <%= submit_tag l(:button_save) %>
<%= link_to_function l(:button_cancel),
"$('#member-#{@member.id}-roles').show(); $('#member-#{@member.id}-form').empty(); return false;" if request.xhr? %>
</p>
diff --git a/app/views/principal_memberships/_edit.html.erb b/app/views/principal_memberships/_edit.html.erb
index af05c4935..d0ab4f10a 100644
--- a/app/views/principal_memberships/_edit.html.erb
+++ b/app/views/principal_memberships/_edit.html.erb
@@ -1,12 +1,15 @@
-<%= form_for(:membership, :url => principal_membership_path(@principal, @membership),
+<%= form_for(@membership, :url => principal_membership_path(@principal, @membership),
+ :as => :membership,
:remote => request.xhr?,
:method => :put) do %>
<p>
<% @roles.each do |role| %>
<label>
- <%= check_box_tag 'membership[role_ids][]', role.id, @membership.roles.to_a.include?(role),
- :disabled => !@membership.role_editable?(role),
- :id => nil %> <%= role.name %>
+ <%= check_box_tag 'membership[role_ids][]',
+ role.id, @membership.roles.to_a.include?(role),
+ :id => nil,
+ :disabled => !@membership.role_editable?(role) %> <%= role.name %>
+ <%= render_role_inheritance(@membership, role) %>
</label><br />
<% end %>
</p>
diff --git a/config/locales/en.yml b/config/locales/en.yml
index effc62f2d..63e33cfab 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1041,6 +1041,8 @@ en:
label_font_proportional: Proportional font
label_last_notes: Last notes
label_nothing_to_preview: Nothing to preview
+ label_inherited_from_parent_project: "Inherited from parent project"
+ label_inherited_from_group: "Inherited from group %{name}"
button_login: Login
button_submit: Submit
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 9a6423a1e..e53486793 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -1252,7 +1252,8 @@ fr:
label_delete_link_to_subtask: "Supprimer la relation avec la sous-tâche"
error_not_allowed_to_log_time_for_other_users: "Vous n'êtes pas autorisé à saisir le temps passé pour d'autres utilisateurs"
permission_log_time_for_other_users: "Saisir le temps passé pour d'autres utilisateurs"
- label_tomorrow: tomorrow
+ label_inherited_from_parent_project: "Hérité du projet parent"
+ label_inherited_from_group: "Hérité du groupe %{name}" label_tomorrow: tomorrow
label_next_week: next week
label_next_month: next month
text_role_no_workflow: No workflow defined for this role
diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css
index 7dde12007..147c8d4a0 100644
--- a/public/stylesheets/application.css
+++ b/public/stylesheets/application.css
@@ -841,9 +841,12 @@ 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; }
-em.info {font-style:normal;font-size:90%;color:#888;display:block;}
+.info {font-size:90%;color:#888;}
+em.info {font-style:normal;display:block;}
em.info.error {padding-left:20px; background:url(../images/exclamation.png) no-repeat 0 50%;}
+form.edit_membership p {margin:0.9em 0;}
+
textarea.text_cf {width:95%; resize:vertical;}
input.string_cf, input.link_cf {width:95%;}
select.bool_cf {width:auto !important;}