Refactor template selector in issuable form
Signed-off-by: Rémy Coutable <remy@rymai.me>
This commit is contained in:
parent
5a0a4506d2
commit
db8fed26af
4 changed files with 67 additions and 43 deletions
|
@ -179,33 +179,6 @@ module BlobHelper
|
|||
}
|
||||
end
|
||||
|
||||
def selected_template(issuable)
|
||||
templates = issuable_templates(issuable)
|
||||
params[:issuable_template] if templates.include?(params[:issuable_template])
|
||||
end
|
||||
|
||||
def can_add_template?(issuable)
|
||||
names = issuable_templates(issuable)
|
||||
names.empty? && can?(current_user, :push_code, @project) && !@project.private?
|
||||
end
|
||||
|
||||
def merge_request_template_names
|
||||
@merge_request_templates ||= Gitlab::Template::MergeRequestTemplate.dropdown_names(ref_project)
|
||||
end
|
||||
|
||||
def issue_template_names
|
||||
@issue_templates ||= Gitlab::Template::IssueTemplate.dropdown_names(ref_project)
|
||||
end
|
||||
|
||||
def issuable_templates(issuable)
|
||||
@issuable_templates ||=
|
||||
if issuable.is_a?(Issue)
|
||||
issue_template_names
|
||||
elsif issuable.is_a?(MergeRequest)
|
||||
merge_request_template_names
|
||||
end
|
||||
end
|
||||
|
||||
def ref_project
|
||||
@ref_project ||= @target_project || @project
|
||||
end
|
||||
|
|
|
@ -30,6 +30,33 @@ module IssuablesHelper
|
|||
end
|
||||
end
|
||||
|
||||
def can_add_template?(issuable)
|
||||
names = issuable_templates(issuable)
|
||||
names.empty? && can?(current_user, :push_code, @project) && !@project.private?
|
||||
end
|
||||
|
||||
def template_dropdown_tag(issuable, &block)
|
||||
title = selected_template(issuable) || "Choose a template"
|
||||
options = {
|
||||
toggle_class: 'js-issuable-selector',
|
||||
title: title,
|
||||
filter: true,
|
||||
placeholder: 'Filter',
|
||||
footer_content: true,
|
||||
data: {
|
||||
data: issuable_templates(issuable),
|
||||
field_name: 'issuable_template',
|
||||
selected: selected_template(issuable),
|
||||
project_path: ref_project.path,
|
||||
namespace_path: ref_project.namespace.path
|
||||
}
|
||||
}
|
||||
|
||||
dropdown_tag(title, options: options) do
|
||||
capture(&block)
|
||||
end
|
||||
end
|
||||
|
||||
def user_dropdown_label(user_id, default_label)
|
||||
return default_label if user_id.nil?
|
||||
return "Unassigned" if user_id == "0"
|
||||
|
@ -153,4 +180,28 @@ module IssuablesHelper
|
|||
|
||||
hexdigest(['issuables_count', issuable_type, opts.sort].flatten.join('-'))
|
||||
end
|
||||
|
||||
def issuable_templates(issuable)
|
||||
@issuable_templates ||=
|
||||
case issuable
|
||||
when Issue
|
||||
issue_template_names
|
||||
when MergeRequest
|
||||
merge_request_template_names
|
||||
else
|
||||
raise 'Unknown issuable type!'
|
||||
end
|
||||
end
|
||||
|
||||
def merge_request_template_names
|
||||
@merge_request_templates ||= Gitlab::Template::MergeRequestTemplate.dropdown_names(ref_project)
|
||||
end
|
||||
|
||||
def issue_template_names
|
||||
@issue_templates ||= Gitlab::Template::IssueTemplate.dropdown_names(ref_project)
|
||||
end
|
||||
|
||||
def selected_template(issuable)
|
||||
params[:issuable_template] if issuable_templates(issuable).include?(params[:issuable_template])
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
- project = @target_project || @project
|
||||
|
||||
= form_errors(issuable)
|
||||
|
||||
- if @conflict
|
||||
|
@ -11,23 +12,9 @@
|
|||
.form-group
|
||||
= f.label :title, class: 'control-label'
|
||||
|
||||
- issuable_template_names = issuable_templates(issuable)
|
||||
= render 'shared/issuable/form/template_selector', issuable: issuable
|
||||
|
||||
- if issuable_template_names.any?
|
||||
.col-sm-3.col-lg-2
|
||||
.js-issuable-selector-wrap{ data: { issuable_type: issuable.class.to_s.underscore.downcase } }
|
||||
- title = selected_template(issuable) || "Choose a template"
|
||||
|
||||
= dropdown_tag(title, options: { toggle_class: 'js-issuable-selector',
|
||||
title: title, filter: true, placeholder: 'Filter', footer_content: true,
|
||||
data: { data: issuable_template_names, field_name: 'issuable_template', selected: selected_template(issuable), project_path: ref_project.path, namespace_path: ref_project.namespace.path } } ) do
|
||||
%ul.dropdown-footer-list
|
||||
%li
|
||||
%a.no-template
|
||||
No template
|
||||
%a.reset-template
|
||||
Reset template
|
||||
%div{ class: issuable_template_names.any? ? 'col-sm-7 col-lg-8' : 'col-sm-10' }
|
||||
%div{ class: issuable_templates(issuable).any? ? 'col-sm-7 col-lg-8' : 'col-sm-10' }
|
||||
= f.text_field :title, maxlength: 255, autofocus: true, autocomplete: 'off',
|
||||
class: 'form-control pad', required: true
|
||||
|
||||
|
|
13
app/views/shared/issuable/form/_template_selector.html.haml
Normal file
13
app/views/shared/issuable/form/_template_selector.html.haml
Normal file
|
@ -0,0 +1,13 @@
|
|||
- issuable = local_assigns.fetch(:issuable, nil)
|
||||
|
||||
- return unless issuable && issuable_templates(issuable).any?
|
||||
|
||||
.col-sm-3.col-lg-2
|
||||
.js-issuable-selector-wrap{ data: { issuable_type: issuable.to_ability_name } }
|
||||
= template_dropdown_tag(issuable) do
|
||||
%ul.dropdown-footer-list
|
||||
%li
|
||||
%a.no-template
|
||||
No template
|
||||
%a.reset-template
|
||||
Reset template
|
Loading…
Reference in a new issue