diff --git a/app/components/rapid_diffs/diff_file_header_component.rb b/app/components/rapid_diffs/diff_file_header_component.rb index 86cacd218784582fffbe1d727317343782fec612..b69da0abf14586a9b1618a8cbefca28586dc5fb3 100644 --- a/app/components/rapid_diffs/diff_file_header_component.rb +++ b/app/components/rapid_diffs/diff_file_header_component.rb @@ -36,7 +36,12 @@ def copy_path_button end def menu_items - @additional_menu_items.sort_by { |item| item[:position] || Float::INFINITY } + [ + view_file_menu_item, + *@additional_menu_items + ] + .filter_map { |item| item unless item.nil? } + .sort_by { |item| item[:position] || Float::INFINITY } end def heading_id @@ -69,5 +74,23 @@ def stats_label def pretty_print_bytes(size) ActiveSupport::NumberHelper.number_to_human_size(size) end + + def view_file_menu_item + project = @diff_file.repository.project + file_path = @diff_file.new_path || @diff_file.old_path + commit_sha = @diff_file.content_sha + + view_path = helpers.project_blob_path(project, helpers.tree_join(commit_sha, file_path)) + + { + text: helpers.safe_format( + s_('RapidDiffs|View file at %{commitId}'), + commitId: @diff_file.content_sha[0..7] + ), + href: view_path, + extraAttrs: { target: '_blank' }, + position: 1 + } + end end end diff --git a/app/components/rapid_diffs/merge_request_diff_file_component.rb b/app/components/rapid_diffs/merge_request_diff_file_component.rb index 866389afe556d050d6ee5078edde9da48d0e9a4a..e39019394fc03a891f285e994853bc5897e64491 100644 --- a/app/components/rapid_diffs/merge_request_diff_file_component.rb +++ b/app/components/rapid_diffs/merge_request_diff_file_component.rb @@ -28,7 +28,7 @@ def edit_in_sfe { text: _('Edit in single-file editor'), href: editor_path, - position: 1 + position: 2 } end end diff --git a/locale/gitlab.pot b/locale/gitlab.pot index a0c2a978c59e122a57ecc34d59cf7fb9e1168921..7255e9553655231bb69e8c43bcc7c924eb03c06e 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -53063,6 +53063,9 @@ msgstr "" msgid "RapidDiffs|View controls" msgstr "" +msgid "RapidDiffs|View file at %{commitId}" +msgstr "" + msgid "Rate Limits" msgstr "" diff --git a/spec/components/rapid_diffs/diff_file_header_component_spec.rb b/spec/components/rapid_diffs/diff_file_header_component_spec.rb index d9eb4c920adae0bba3f919a5f76d94f517cd294a..8ad831bcb6242b5cc390fade06090db47cc50c02 100644 --- a/spec/components/rapid_diffs/diff_file_header_component_spec.rb +++ b/spec/components/rapid_diffs/diff_file_header_component_spec.rb @@ -155,10 +155,12 @@ allow(diff_file).to receive(:content_sha).and_return(content_sha) end - it 'does not render menu toggle without options' do + it 'always renders the "View file at [SHA]" menu item' do render_component - expect(page).not_to have_css('button[data-click="toggleOptionsMenu"][aria-label="Show options"]') + options_menu_items = Gitlab::Json.parse(page.find('script', visible: false).text) + + expect(options_menu_items.first['text']).to eq('View file at abc123') end it 'renders additional menu items with respective order' do diff --git a/spec/components/rapid_diffs/merge_request_diff_file_component_spec.rb b/spec/components/rapid_diffs/merge_request_diff_file_component_spec.rb index 529219c936537f4a34d9c81a7f263313a8f49df1..47d0d1893d23eabe0e62b92d79cbf6555efe4758 100644 --- a/spec/components/rapid_diffs/merge_request_diff_file_component_spec.rb +++ b/spec/components/rapid_diffs/merge_request_diff_file_component_spec.rb @@ -36,8 +36,8 @@ options_menu_items = Gitlab::Json.parse(page.find('script', visible: false).text) - expect(options_menu_items[0]['text']).to eq('Edit in single-file editor') - expect(options_menu_items[0]['href']).to include("#{edit_path_base}#{merge_request.iid}") + expect(options_menu_items[1]['text']).to eq('Edit in single-file editor') + expect(options_menu_items[1]['href']).to include("#{edit_path_base}#{merge_request.iid}") end end end