Commit 7f2dc3cf authored by Andrew Fontaine's avatar Andrew Fontaine

Merge branch '230969-convert-issues-autocomplete-from-at-js-to-tribute' into 'master'

Convert issues autocomplete from at.js to tribute

Closes #230969

See merge request gitlab-org/gitlab!39627
parents 98c48a09 c85084a4
...@@ -6,6 +6,7 @@ import { spriteIcon } from '~/lib/utils/common_utils'; ...@@ -6,6 +6,7 @@ import { spriteIcon } from '~/lib/utils/common_utils';
import SidebarMediator from '~/sidebar/sidebar_mediator'; import SidebarMediator from '~/sidebar/sidebar_mediator';
const AutoComplete = { const AutoComplete = {
Issues: 'issues',
Labels: 'labels', Labels: 'labels',
Members: 'members', Members: 'members',
}; };
...@@ -17,6 +18,14 @@ function doesCurrentLineStartWith(searchString, fullText, selectionStart) { ...@@ -17,6 +18,14 @@ function doesCurrentLineStartWith(searchString, fullText, selectionStart) {
} }
const autoCompleteMap = { const autoCompleteMap = {
[AutoComplete.Issues]: {
filterValues() {
return this[AutoComplete.Issues];
},
menuItemTemplate({ original }) {
return `<small>${original.reference || original.iid}</small> ${escape(original.title)}`;
},
},
[AutoComplete.Labels]: { [AutoComplete.Labels]: {
filterValues() { filterValues() {
const fullText = this.$slots.default?.[0]?.elm?.value; const fullText = this.$slots.default?.[0]?.elm?.value;
...@@ -106,6 +115,13 @@ export default { ...@@ -106,6 +115,13 @@ export default {
this.tribute = new Tribute({ this.tribute = new Tribute({
collection: [ collection: [
{
trigger: '#',
lookup: value => value.iid + value.title,
menuItemTemplate: autoCompleteMap[AutoComplete.Issues].menuItemTemplate,
selectTemplate: ({ original }) => original.reference || `#${original.iid}`,
values: this.getValues(AutoComplete.Issues),
},
{ {
trigger: '@', trigger: '@',
fillAttr: 'username', fillAttr: 'username',
......
...@@ -167,7 +167,7 @@ export default { ...@@ -167,7 +167,7 @@ export default {
return new GLForm($(this.$refs['gl-form']), { return new GLForm($(this.$refs['gl-form']), {
emojis: this.enableAutocomplete, emojis: this.enableAutocomplete,
members: this.enableAutocomplete && !this.glFeatures.tributeAutocomplete, members: this.enableAutocomplete && !this.glFeatures.tributeAutocomplete,
issues: this.enableAutocomplete, issues: this.enableAutocomplete && !this.glFeatures.tributeAutocomplete,
mergeRequests: this.enableAutocomplete, mergeRequests: this.enableAutocomplete,
epics: this.enableAutocomplete, epics: this.enableAutocomplete,
milestones: this.enableAutocomplete, milestones: this.enableAutocomplete,
......
...@@ -504,6 +504,23 @@ RSpec.describe 'GFM autocomplete', :js do ...@@ -504,6 +504,23 @@ RSpec.describe 'GFM autocomplete', :js do
expect(page).to have_selector('.tribute-container', visible: true) expect(page).to have_selector('.tribute-container', visible: true)
end end
it 'opens autocomplete menu for Issues when field starts with text with item escaping HTML characters' do
issue_xss_title = 'This will execute alert<img src=x onerror=alert(2)&lt;img src=x onerror=alert(1)&gt;'
create(:issue, project: project, title: issue_xss_title)
page.within '.timeline-content-form' do
find('#note-body').native.send_keys('#')
end
wait_for_requests
expect(page).to have_selector('.tribute-container', visible: true)
page.within '.tribute-container ul' do
expect(page.all('li').first.text).to include(issue_xss_title)
end
end
it 'opens autocomplete menu for Username when field starts with text with item escaping HTML characters' do it 'opens autocomplete menu for Username when field starts with text with item escaping HTML characters' do
page.within '.timeline-content-form' do page.within '.timeline-content-form' do
find('#note-body').native.send_keys('@ev') find('#note-body').native.send_keys('@ev')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment