Commit 50e1407b authored by Kerri Miller's avatar Kerri Miller

Merge branch 'add-support-for-epic-descriptions-quick-actions-on-epic-creation-form' into 'master'

Fix quick action autocomplete in new epic form

See merge request gitlab-org/gitlab!37099
parents cccfe4b2 c4df0fbf
......@@ -17,12 +17,16 @@ module QuickActions
# rubocop: disable CodeReuse/ActiveRecord
def issue(type_id)
return project.issues.build if type_id.nil?
IssuesFinder.new(current_user, project_id: project.id).find_by(iid: type_id) || project.issues.build
end
# rubocop: enable CodeReuse/ActiveRecord
# rubocop: disable CodeReuse/ActiveRecord
def merge_request(type_id)
return project.merge_requests.build if type_id.nil?
MergeRequestsFinder.new(current_user, project_id: project.id).find_by(iid: type_id) || project.merge_requests.build
end
# rubocop: enable CodeReuse/ActiveRecord
......
......@@ -46,10 +46,9 @@ class Groups::AutocompleteSourcesController < Groups::ApplicationController
# rubocop: disable CodeReuse/ActiveRecord
def target
case params[:type]&.downcase
when 'epic'
EpicsFinder.new(current_user, group_id: @group.id).find_by(iid: params[:type_id])
end
QuickActions::TargetService
.new(nil, current_user, group: @group)
.execute(params[:type], params[:type_id])
end
# rubocop: enable CodeReuse/ActiveRecord
end
......@@ -20,7 +20,9 @@ class Groups::EpicsController < Groups::ApplicationController
push_frontend_feature_flag(:vue_issuable_epic_sidebar, @group)
end
def new; end
def new
@noteable = Epic.new
end
def index
@epics = @issuables
......
......@@ -14,6 +14,9 @@ module EE
# rubocop: disable CodeReuse/ActiveRecord
def epic(type_id)
group = params[:group]
return group.epics.build if type_id.nil?
EpicsFinder.new(current_user, group_id: group.id).find_by(iid: type_id) || group.epics.build
end
# rubocop: enable CodeReuse/ActiveRecord
......
- @gfm_form = true
- add_to_breadcrumbs _("Epics"), group_epics_path(@group)
- breadcrumb_title _("New")
- page_title _("New epic")
......
---
title: Fix quick actions autocomplete in new epic form
merge_request: 37099
author:
type: fixed
......@@ -105,5 +105,17 @@ RSpec.describe Groups::AutocompleteSourcesController do
}
)
end
it 'handles new epics' do
get :commands, params: { group_id: group, type: 'Epic', type_id: nil }
expect(json_response).to be_an(Array)
expect(json_response).to include(
{
'name' => 'cc', 'aliases' => [], 'description' => 'CC',
'params' => ['@user'], 'warning' => '', 'icon' => ''
}
)
end
end
end
......@@ -3,204 +3,229 @@
require 'spec_helper'
RSpec.describe 'GFM autocomplete', :js do
let(:user) { create(:user, name: '💃speciąl someone💃', username: 'someone.special') }
let(:group) { create(:group) }
let(:label) { create(:group_label, group: group, title: 'special+') }
let(:epic) { create(:epic, group: group) }
let_it_be(:user) { create(:user, name: '💃speciąl someone💃', username: 'someone.special') }
let_it_be(:group) { create(:group) }
let_it_be(:epic) { create(:epic, group: group) }
before do
stub_licensed_features(epics: true)
before_all do
group.add_maintainer(user)
sign_in(user)
visit group_epic_path(group, epic)
wait_for_requests
end
it 'opens quick action autocomplete when updating description' do
find('.js-issuable-edit').click
find('#issue-description').native.send_keys('/')
expect(page).to have_selector('.atwho-container')
before do
stub_licensed_features(epics: true)
sign_in(user)
end
context 'issuables' do
let(:project) { create(:project, :repository, namespace: group) }
context 'issues' do
it 'shows issues of group' do
issue_1 = create(:issue, project: project)
issue_2 = create(:issue, project: project)
context 'for a new epic' do
let_it_be(:label) { create(:group_label, group: group) }
type(find('#note-body'), '#')
expect_resources(shown: [issue_1, issue_2])
end
before do
visit new_group_epic_path(group)
end
context 'merge requests' do
it 'shows merge requests of group' do
mr_1 = create(:merge_request, source_project: project)
mr_2 = create(:merge_request, source_project: project, source_branch: 'other-branch')
it 'opens quick action autocomplete in the description field' do
find('#epic-description').native.send_keys('/la')
type(find('#note-body'), '!')
expect(page).to have_selector('.atwho-container')
expect_resources(shown: [mr_1, mr_2])
page.within '.atwho-container #at-view-commands' do
expect(find('li', match: :first)).to have_content('/label')
end
end
end
context 'epics' do
let!(:epic2) { create(:epic, group: group, title: 'make tea') }
it 'shows epics' do
note = find('#note-body')
context 'for an existing epic' do
before do
visit group_epic_path(group, epic)
# It should show all the epics on "&".
type(note, '&')
expect_resources(shown: [epic, epic2])
wait_for_requests
end
end
context 'milestone' do
it 'shows group milestones' do
project = create(:project, namespace: group)
milestone_1 = create(:milestone, title: 'milestone_1', group: group)
milestone_2 = create(:milestone, title: 'milestone_2', group: group)
milestone_3 = create(:milestone, title: 'milestone_3', project: project)
note = find('#note-body')
it 'opens quick action autocomplete when updating description' do
find('.js-issuable-edit').click
type(note, '%')
find('#issue-description').native.send_keys('/')
expect_resources(shown: [milestone_1, milestone_2], not_shown: [milestone_3])
expect(page).to have_selector('.atwho-container')
end
end
context 'labels' do
let!(:backend) { create(:group_label, group: group, title: 'backend') }
let!(:bug) { create(:group_label, group: group, title: 'bug') }
let!(:feature_proposal) { create(:group_label, group: group, title: 'feature proposal') }
context 'issuables' do
let(:project) { create(:project, :repository, namespace: group) }
context 'when no labels are assigned' do
it 'shows all labels for ~' do
note = find('#note-body')
context 'issues' do
it 'shows issues of group' do
issue_1 = create(:issue, project: project)
issue_2 = create(:issue, project: project)
type(note, '~')
wait_for_requests
type(find('#note-body'), '#')
expect_resources(shown: [backend, bug, feature_proposal])
expect_resources(shown: [issue_1, issue_2])
end
end
it 'shows all labels for /label ~' do
note = find('#note-body')
context 'merge requests' do
it 'shows merge requests of group' do
mr_1 = create(:merge_request, source_project: project)
mr_2 = create(:merge_request, source_project: project, source_branch: 'other-branch')
type(note, '/label ~')
wait_for_requests
type(find('#note-body'), '!')
expect_resources(shown: [backend, bug, feature_proposal])
expect_resources(shown: [mr_1, mr_2])
end
end
end
it 'shows all labels for /relabel ~' do
note = find('#note-body')
context 'epics' do
let!(:epic2) { create(:epic, group: group, title: 'make tea') }
type(note, '/relabel ~')
wait_for_requests
it 'shows epics' do
note = find('#note-body')
expect_resources(shown: [backend, bug, feature_proposal])
# It should show all the epics on "&".
type(note, '&')
expect_resources(shown: [epic, epic2])
end
end
it 'shows no labels for /unlabel ~' do
context 'milestone' do
it 'shows group milestones' do
project = create(:project, namespace: group)
milestone_1 = create(:milestone, title: 'milestone_1', group: group)
milestone_2 = create(:milestone, title: 'milestone_2', group: group)
milestone_3 = create(:milestone, title: 'milestone_3', project: project)
note = find('#note-body')
type(note, '/unlabel ~')
wait_for_requests
type(note, '%')
expect_resources(not_shown: [backend, bug, feature_proposal])
expect_resources(shown: [milestone_1, milestone_2], not_shown: [milestone_3])
end
end
context 'when some labels are assigned' do
before do
epic.labels << [backend]
end
context 'labels' do
let_it_be(:backend) { create(:group_label, group: group, title: 'backend') }
let_it_be(:bug) { create(:group_label, group: group, title: 'bug') }
let_it_be(:feature_proposal) { create(:group_label, group: group, title: 'feature proposal') }
it 'shows all labels for ~' do
note = find('#note-body')
context 'when no labels are assigned' do
it 'shows all labels for ~' do
note = find('#note-body')
type(note, '~')
wait_for_requests
type(note, '~')
wait_for_requests
expect_resources(shown: [backend, bug, feature_proposal])
end
expect_resources(shown: [backend, bug, feature_proposal])
end
it 'shows only unset labels for /label ~' do
note = find('#note-body')
it 'shows all labels for /label ~' do
note = find('#note-body')
type(note, '/label ~')
wait_for_requests
type(note, '/label ~')
wait_for_requests
expect_resources(shown: [bug, feature_proposal], not_shown: [backend])
end
expect_resources(shown: [backend, bug, feature_proposal])
end
it 'shows all labels for /relabel ~' do
note = find('#note-body')
it 'shows all labels for /relabel ~' do
note = find('#note-body')
type(note, '/relabel ~')
wait_for_requests
type(note, '/relabel ~')
wait_for_requests
expect_resources(shown: [backend, bug, feature_proposal])
end
expect_resources(shown: [backend, bug, feature_proposal])
end
it 'shows only set labels for /unlabel ~' do
note = find('#note-body')
it 'shows no labels for /unlabel ~' do
note = find('#note-body')
type(note, '/unlabel ~')
wait_for_requests
type(note, '/unlabel ~')
wait_for_requests
expect_resources(shown: [backend], not_shown: [bug, feature_proposal])
expect_resources(not_shown: [backend, bug, feature_proposal])
end
end
end
context 'when all labels are assigned' do
before do
epic.labels << [backend, bug, feature_proposal]
end
context 'when some labels are assigned' do
before do
epic.labels << [backend]
end
it 'shows all labels for ~' do
note = find('#note-body')
it 'shows all labels for ~' do
note = find('#note-body')
type(note, '~')
wait_for_requests
type(note, '~')
wait_for_requests
expect_resources(shown: [backend, bug, feature_proposal])
end
expect_resources(shown: [backend, bug, feature_proposal])
end
it 'shows no labels for /label ~' do
note = find('#note-body')
it 'shows only unset labels for /label ~' do
note = find('#note-body')
type(note, '/label ~')
wait_for_requests
type(note, '/label ~')
wait_for_requests
expect_resources(not_shown: [backend, bug, feature_proposal])
end
expect_resources(shown: [bug, feature_proposal], not_shown: [backend])
end
it 'shows all labels for /relabel ~' do
note = find('#note-body')
it 'shows all labels for /relabel ~' do
note = find('#note-body')
type(note, '/relabel ~')
wait_for_requests
expect_resources(shown: [backend, bug, feature_proposal])
end
type(note, '/relabel ~')
wait_for_requests
it 'shows only set labels for /unlabel ~' do
note = find('#note-body')
expect_resources(shown: [backend, bug, feature_proposal])
type(note, '/unlabel ~')
wait_for_requests
expect_resources(shown: [backend], not_shown: [bug, feature_proposal])
end
end
it 'shows all labels for /unlabel ~' do
note = find('#note-body')
context 'when all labels are assigned' do
before do
epic.labels << [backend, bug, feature_proposal]
end
it 'shows all labels for ~' do
note = find('#note-body')
type(note, '~')
wait_for_requests
expect_resources(shown: [backend, bug, feature_proposal])
end
it 'shows no labels for /label ~' do
note = find('#note-body')
type(note, '/label ~')
wait_for_requests
expect_resources(not_shown: [backend, bug, feature_proposal])
end
it 'shows all labels for /relabel ~' do
note = find('#note-body')
type(note, '/relabel ~')
wait_for_requests
expect_resources(shown: [backend, bug, feature_proposal])
end
it 'shows all labels for /unlabel ~' do
note = find('#note-body')
type(note, '/unlabel ~')
wait_for_requests
type(note, '/unlabel ~')
wait_for_requests
expect_resources(shown: [backend, bug, feature_proposal])
expect_resources(shown: [backend, bug, feature_proposal])
end
end
end
end
......
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