Commit 132cd009 authored by Toon Claes's avatar Toon Claes

Backport issuable for assignee slash commands from EE

Avoid conflicts when merge CE to EE by backporting code from EE.

Instead of checking in `SlashCommands::InterpretService` what the issuable the
type of the issuable is, ask the issuable if it is capable to do those thing and
implement it in the issuable itself. The issuable will check if it's possible
and if the licensed feature is available.

This should also make it easier to ever add multiple assignees to MergeRequests.
parent a8d4bf97
......@@ -102,6 +102,18 @@ module Issuable
def locking_enabled?
title_changed? || description_changed?
end
def allows_multiple_assignees?
false
end
def has_multiple_assignees?
supports_multiple_assignees? && assignees.count > 1
end
def supports_multiple_assignees?
respond_to?(:assignee_ids)
end
end
module ClassMethods
......
......@@ -92,9 +92,12 @@ module QuickActions
desc 'Assign'
explanation do |users|
"Assigns #{users.first.to_reference}." if users.any?
users = issuable.allows_multiple_assignees? ? users : users.take(1)
"Assigns #{users.map(&:to_reference).to_sentence}."
end
params do
issuable.allows_multiple_assignees? ? '@user1 @user2' : '@user'
end
params '@user'
condition do
current_user.can?(:"admin_#{issuable.to_ability_name}", project)
end
......@@ -104,25 +107,44 @@ module QuickActions
command :assign do |users|
next if users.empty?
if issuable.is_a?(Issue)
if issuable.allows_multiple_assignees?
@updates[:assignee_ids] = issuable.assignees.pluck(:id) + users.map(&:id)
elsif issuable.supports_multiple_assignees?
@updates[:assignee_ids] = [users.last.id]
else
@updates[:assignee_id] = users.last.id
end
end
desc 'Remove assignee'
desc do
if issuable.allows_multiple_assignees?
'Remove all or specific assignee(s)'
else
'Remove assignee'
end
end
explanation do
"Removes assignee #{issuable.assignees.first.to_reference}."
"Removes #{'assignee'.pluralize(issuable.assignees.size)} #{issuable.assignees.map(&:to_reference).to_sentence}."
end
params do
issuable.allows_multiple_assignees? ? '@user1 @user2' : ''
end
condition do
issuable.persisted? &&
issuable.assignees.any? &&
current_user.can?(:"admin_#{issuable.to_ability_name}", project)
end
command :unassign do
if issuable.is_a?(Issue)
@updates[:assignee_ids] = []
command :unassign do |unassign_param = nil|
# When multiple users are assigned, all will be unassigned if multiple assignees are no longer allowed
users = extract_users(unassign_param) if issuable.allows_multiple_assignees?
if issuable.supports_multiple_assignees?
@updates[:assignee_ids] =
if users&.any?
issuable.assignees.pluck(:id) - users.map(&:id)
else
[]
end
else
@updates[:assignee_id] = nil
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