diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2019-03-15 10:09:28 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2019-03-15 10:09:28 +0000 |
commit | b4c23f066e71978f36d8bd4aeae02be11385fcca (patch) | |
tree | 3555bb21efc0778859ea316c0a567f89c474502d | |
parent | 5da9cc59ee48b8e86b2836909ddff970cce76545 (diff) | |
download | redmine-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.rb | 2 | ||||
-rw-r--r-- | app/helpers/members_helper.rb | 15 | ||||
-rw-r--r-- | app/models/member.rb | 10 | ||||
-rw-r--r-- | app/models/member_role.rb | 5 | ||||
-rw-r--r-- | app/views/members/_edit.html.erb | 3 | ||||
-rw-r--r-- | app/views/principal_memberships/_edit.html.erb | 11 | ||||
-rw-r--r-- | config/locales/en.yml | 2 | ||||
-rw-r--r-- | config/locales/fr.yml | 3 | ||||
-rw-r--r-- | public/stylesheets/application.css | 5 |
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;} |