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');
+ });
+});