diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss index cdef843c9b43f1efa2e3029ed10ce4d8dd195a9e..ad05cbd1f0e91aceb37bb79c8c442e5a8fe4cfa4 100644 --- a/app/assets/stylesheets/pages/issuable.scss +++ b/app/assets/stylesheets/pages/issuable.scss @@ -890,3 +890,13 @@ } } } + +.icon-overlap-and-shadow { + filter: + drop-shadow(0 1px 0.5px #fff) + drop-shadow(1px 0 0.5px #fff) + drop-shadow(0 -1px 0.5px #fff) + drop-shadow(-1px 0 0.5px #fff); + margin-right: -7px; + z-index: 1; +} diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index c9966d87b6843a30519547d413ece1fa2dd27db2..b39cd485fe8989553b006c6122a1433b71aa2089 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -62,10 +62,10 @@ def link_to_member(project, author, opts = {}, &block) name: author.name } - inject_classes = ["author-link"] + inject_classes = ["author-link", opts[:extra_class]] if opts[:name] - inject_classes.concat(["js-user-link", opts[:extra_class], opts[:mobile_classes]]) + inject_classes.concat(["js-user-link", opts[:mobile_classes]]) else inject_classes.append( "has-tooltip" ) end diff --git a/app/views/shared/issuable/_assignees.html.haml b/app/views/shared/issuable/_assignees.html.haml index 196d0417fb85f0aea5a74484a42b2df93224676f..e6d722cb08d0af7ab666a0643bffb99f49c4b0da 100644 --- a/app/views/shared/issuable/_assignees.html.haml +++ b/app/views/shared/issuable/_assignees.html.haml @@ -3,8 +3,11 @@ - render_count = assignees_rendering_overflow ? max_render - 1 : max_render - more_assignees_count = issuable.assignees.size - render_count -- issuable.assignees.take(render_count).each do |assignee| # rubocop: disable CodeReuse/ActiveRecord - = link_to_member(@project, assignee, name: false, title: _("Assigned to %{name}") % { name: assignee.name}) +- if issuable.instance_of?(MergeRequest) && Feature.enabled?(:mr_attention_requests, default_enabled: :yaml) + = render 'shared/issuable/merge_request_assignees', issuable: issuable, count: render_count +- else + - issuable.assignees.take(render_count).each do |assignee| # rubocop: disable CodeReuse/ActiveRecord + = link_to_member(@project, assignee, name: false, title: s_("MrList|Assigned to %{name}, go to their profile.") % { name: assignee.name}) - if more_assignees_count > 0 %span{ class: 'avatar-counter has-tooltip', data: { container: 'body', placement: 'bottom', 'line-type' => 'old', qa_selector: 'avatar_counter_content' }, title: _("+%{more_assignees_count} more assignees") % { more_assignees_count: more_assignees_count} } diff --git a/app/views/shared/issuable/_merge_request_assignees.html.haml b/app/views/shared/issuable/_merge_request_assignees.html.haml new file mode 100644 index 0000000000000000000000000000000000000000..13dc6ae4abbc772f8d271d8ff2a61bd913e7d545 --- /dev/null +++ b/app/views/shared/issuable/_merge_request_assignees.html.haml @@ -0,0 +1,8 @@ +- issuable.merge_request_assignees.take(count).each do |merge_request_assignee| # rubocop: disable CodeReuse/ActiveRecord + - assignee = merge_request_assignee.assignee + - assignee_tooltip = ( merge_request_assignee.attention_requested? ? s_("MrList|Attention requested from assignee %{name}, go to their profile.") : s_("MrList|Assigned to %{name}, go to their profile.") ) % { name: assignee.name} + + = link_to_member(@project, assignee, name: false, title: assignee_tooltip, extra_class: "gl-flex-direction-row-reverse") do + - if merge_request_assignee.attention_requested? + %span.gl-display-inline-flex + = sprite_icon('attention-solid-sm', css_class: 'gl-text-orange-500 icon-overlap-and-shadow') diff --git a/app/views/shared/issuable/_merge_request_reviewers.html.haml b/app/views/shared/issuable/_merge_request_reviewers.html.haml new file mode 100644 index 0000000000000000000000000000000000000000..df5c69e309f7d13545461688c5ffe251ead9e65f --- /dev/null +++ b/app/views/shared/issuable/_merge_request_reviewers.html.haml @@ -0,0 +1,8 @@ +- issuable.merge_request_reviewers.take(count).each do |merge_request_reviewer| # rubocop: disable CodeReuse/ActiveRecord + - reviewer = merge_request_reviewer.reviewer + - reviewer_tooltip = ( merge_request_reviewer.attention_requested? ? s_("MrList|Attention requested from reviewer %{name}, go to their profile.") : s_("MrList|Review requested from %{name}, go to their profile.") ) % { name: reviewer.name} + + = link_to_member(@project, reviewer, name: false, title: reviewer_tooltip, extra_class: "gl-flex-direction-row-reverse") do + - if merge_request_reviewer.attention_requested? + %span.gl-display-inline-flex + = sprite_icon('attention-solid-sm', css_class: 'gl-text-orange-500 icon-overlap-and-shadow') diff --git a/app/views/shared/issuable/_reviewers.html.haml b/app/views/shared/issuable/_reviewers.html.haml index 8e66135a20b2ec35ee8063745177f2bedd13c423..0bb0faa0bb87a69e9ba33a84556a64b63388d895 100644 --- a/app/views/shared/issuable/_reviewers.html.haml +++ b/app/views/shared/issuable/_reviewers.html.haml @@ -3,8 +3,11 @@ - render_count = reviewers_rendering_overflow ? max_render - 1 : max_render - more_reviewers_count = issuable.reviewers.size - render_count -- issuable.reviewers.take(render_count).each do |reviewer| # rubocop: disable CodeReuse/ActiveRecord - = link_to_member(@project, reviewer, name: false, title: _("Review requested from %{name}") % { name: reviewer.name}) +- if issuable.instance_of?(MergeRequest) && Feature.enabled?(:mr_attention_requests, default_enabled: :yaml) + = render 'shared/issuable/merge_request_reviewers', issuable: issuable, count: render_count +- else + - issuable.reviewers.take(render_count).each do |reviewer| # rubocop: disable CodeReuse/ActiveRecord + = link_to_member(@project, reviewer, name: false, title: s_("MrList|Review requested from %{name}, go to their profile.") % { name: reviewer.name}) - if more_reviewers_count > 0 %span{ class: 'avatar-counter has-tooltip', data: { container: 'body', placement: 'bottom', 'line-type' => 'old' }, title: _("+%{more_reviewers_count} more reviewers") % { more_reviewers_count: more_reviewers_count} } diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 85934f61eeff58feb98bb93035915c297d5a9c52..00437435f4d6e916a39dbc11c970ff8adb2d4dc0 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -4903,9 +4903,6 @@ msgstr "" msgid "Assigned to %{assignee_name}" msgstr "" -msgid "Assigned to %{name}" -msgstr "" - msgid "Assigned to me" msgstr "" @@ -23407,6 +23404,18 @@ msgstr "" msgid "MrDeploymentActions|Stop environment" msgstr "" +msgid "MrList|Assigned to %{name}, go to their profile." +msgstr "" + +msgid "MrList|Attention requested from assignee %{name}, go to their profile." +msgstr "" + +msgid "MrList|Attention requested from reviewer %{name}, go to their profile." +msgstr "" + +msgid "MrList|Review requested from %{name}, go to their profile." +msgstr "" + msgid "Multi-project" msgstr "" @@ -30690,9 +30699,6 @@ msgstr "" msgid "Review changes" msgstr "" -msgid "Review requested from %{name}" -msgstr "" - msgid "Review requests for you" msgstr "" diff --git a/spec/features/merge_requests/user_mass_updates_spec.rb b/spec/features/merge_requests/user_mass_updates_spec.rb index 46c12784ea879890d12549d71ad214c10ece95a9..f781ba0827c14e872524074d136b3581b7bfdc0e 100644 --- a/spec/features/merge_requests/user_mass_updates_spec.rb +++ b/spec/features/merge_requests/user_mass_updates_spec.rb @@ -8,6 +8,8 @@ let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } before do + stub_feature_flags(mr_attention_requests: false) + project.add_maintainer(user) sign_in(user) end @@ -59,6 +61,18 @@ expect(find('.merge-request')).to have_link "Assigned to #{user.name}" end + + describe 'with attention requests feature flag on' do + before do + stub_feature_flags(mr_attention_requests: true) + end + + it 'updates merge request with assignee' do + change_assignee(user.name) + + expect(find('.issuable-meta a.author-link')[:title]).to eq "Attention requested from assignee #{user.name}, go to their profile." + end + end end describe 'remove assignee' do