diff --git a/app/assets/javascripts/rapid_diffs/adapters/options_menu.js b/app/assets/javascripts/rapid_diffs/adapters/options_menu.js index f69a96b82e757a0d5cea622e8ca0085c7f52bfba..3dc1adbd58cf4d9a1a12eea365cd09e3e35d3075 100644 --- a/app/assets/javascripts/rapid_diffs/adapters/options_menu.js +++ b/app/assets/javascripts/rapid_diffs/adapters/options_menu.js @@ -1,5 +1,6 @@ import Vue from 'vue'; import { GlDisclosureDropdown } from '@gitlab/ui'; +import DiffFileOptionsMenuItem from '~/rapid_diffs/app/components/diff_file_options_menu_item.vue'; import { s__ } from '~/locale'; function getMenuItems(container) { @@ -26,21 +27,29 @@ export const optionsMenuAdapter = { }); }, render(h) { - return h(GlDisclosureDropdown, { - props: { - icon: 'ellipsis_v', - startOpened: true, - noCaret: true, - category: 'tertiary', - size: 'small', - items, - toggleText: s__('RapidDiffs|Show options'), - textSrOnly: true, + return h( + GlDisclosureDropdown, + { + props: { + icon: 'ellipsis_v', + startOpened: true, + noCaret: true, + category: 'tertiary', + size: 'small', + toggleText: s__('RapidDiffs|Show options'), + textSrOnly: true, + }, + attrs: { + 'data-options-toggle': true, + }, }, - attrs: { - 'data-options-toggle': true, - }, - }); + items.map((item) => + h(DiffFileOptionsMenuItem, { + props: { item }, + key: item.text, + }), + ), + ); }, }); }, diff --git a/app/assets/javascripts/rapid_diffs/app/components/diff_file_options_menu_item.vue b/app/assets/javascripts/rapid_diffs/app/components/diff_file_options_menu_item.vue new file mode 100644 index 0000000000000000000000000000000000000000..cb0050ae0e3838d87ad280b86d27249521cfe293 --- /dev/null +++ b/app/assets/javascripts/rapid_diffs/app/components/diff_file_options_menu_item.vue @@ -0,0 +1,34 @@ + + + diff --git a/app/components/rapid_diffs/diff_file_header_component.rb b/app/components/rapid_diffs/diff_file_header_component.rb index b69da0abf14586a9b1618a8cbefca28586dc5fb3..6dff61ba33d01f4b5ff4de26dfcb5436d43ca55c 100644 --- a/app/components/rapid_diffs/diff_file_header_component.rb +++ b/app/components/rapid_diffs/diff_file_header_component.rb @@ -85,7 +85,7 @@ def view_file_menu_item { text: helpers.safe_format( s_('RapidDiffs|View file at %{commitId}'), - commitId: @diff_file.content_sha[0..7] + commitId: helpers.tag.code(@diff_file.content_sha[0..7]) ), href: view_path, extraAttrs: { target: '_blank' }, 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 8ad831bcb6242b5cc390fade06090db47cc50c02..35b59281938bfc2595d7f3ef208c460388e5a407 100644 --- a/spec/components/rapid_diffs/diff_file_header_component_spec.rb +++ b/spec/components/rapid_diffs/diff_file_header_component_spec.rb @@ -155,12 +155,12 @@ allow(diff_file).to receive(:content_sha).and_return(content_sha) end - it 'always renders the "View file at [SHA]" menu item' do + it 'always renders the "View file at [SHA]" menu item (in a code tag)' do render_component options_menu_items = Gitlab::Json.parse(page.find('script', visible: false).text) - expect(options_menu_items.first['text']).to eq('View file at abc123') + 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/frontend/rapid_diffs/app/components/diff_file_options_menu_item_spec.js b/spec/frontend/rapid_diffs/app/components/diff_file_options_menu_item_spec.js new file mode 100644 index 0000000000000000000000000000000000000000..fbb79eee23922325ba4369ca791187263b6da31e --- /dev/null +++ b/spec/frontend/rapid_diffs/app/components/diff_file_options_menu_item_spec.js @@ -0,0 +1,32 @@ +import { shallowMount } from '@vue/test-utils'; +import { GlDisclosureDropdownItem } from '@gitlab/ui'; +import DiffFileOptionsMenuItem from '~/rapid_diffs/app/components/diff_file_options_menu_item.vue'; + +describe('DiffFileOptionsMenuItem', () => { + let wrapper; + + const createComponent = (item = {}) => { + wrapper = shallowMount(DiffFileOptionsMenuItem, { + propsData: { item }, + }); + }; + + const findDropdownItem = () => wrapper.findComponent(GlDisclosureDropdownItem); + + it('passes the item prop to GlDisclosureDropdownItem', () => { + const item = { text: 'Test item' }; + createComponent(item); + + expect(findDropdownItem().props('item')).toBe(item); + }); + + it('renders HTML content in the list-item slot', () => { + const item = { text: 'View file at abc1234' }; + createComponent(item); + + const slotContent = findDropdownItem().find('span'); + + expect(slotContent.exists()).toBe(true); + expect(slotContent.html()).toContain('abc1234'); + }); +});