]> source.dussan.org Git - redmine.git/commitdiff
Display details about inheritance when editing a member roles (#31032).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Fri, 15 Mar 2019 10:09:28 +0000 (10:09 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Fri, 15 Mar 2019 10:09:28 +0000 (10:09 +0000)
git-svn-id: http://svn.redmine.org/redmine/trunk@17968 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/principal_memberships_controller.rb
app/helpers/members_helper.rb
app/models/member.rb
app/models/member_role.rb
app/views/members/_edit.html.erb
app/views/principal_memberships/_edit.html.erb
config/locales/en.yml
config/locales/fr.yml
public/stylesheets/application.css

index 68770628fc21e1b56236791ab55aad5a0df7ad78..a803a20b1a11bca5287adb67a1d974204721f18a 100644 (file)
@@ -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]
index 54ff8eb87eee903e8ac3e9c37ce0140c66ad3be8..971c43fb17ef06a0bd4caf5a4fa26acc3916bad8 100644 (file)
@@ -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
index 02f019402e7069c3d1b8e44b611725ac26a3d0f7..c9c5c2d54ac5b0f8756aca623eb55432940f676d 100644 (file)
@@ -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)
index fa49671d283848ce5341335a3457bb0fdf75a489..41734af269747f3993233674c4c1aa79f054a121 100644 (file)
@@ -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
index 91c340fecb25dad16caf540eedbe1ce4214310ba..e3c5ec747edb5efbd57d7b0ceed8e9f573e263c9 100644 (file)
@@ -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>
index af05c49358f03068373c3c6b8e0a1090af3a9f18..d0ab4f10a1536f3dce200de611c90fb82c90a110 100644 (file)
@@ -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>
index effc62f2dd0179a39f0ae0737454430d044baaf1..63e33cfab21dec41d0ddf40056a22567c25bb0fb 100644 (file)
@@ -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
index 9a6423a1ea9e9d06ec19b3294ef5091f72d8ae60..e534867933480a918d6073b6fa589cf2a465e4da 100644 (file)
@@ -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
index 7dde1200796d9e5484494bf6cca3a2510adf5176..147c8d4a00008574d428faeff30613bb8d1f269b 100644 (file)
@@ -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;}