2015-12-23 02:04:40 +05:30
module ButtonHelper
# Output a "Copy to Clipboard" button
#
2017-08-17 22:00:37 +05:30
# data - Data attributes passed to `content_tag` (default: {}):
# :text - Text to copy (optional)
# :gfm - GitLab Flavored Markdown to copy, if different from `text` (optional)
# :target - Selector for target element to copy from (optional)
2015-12-23 02:04:40 +05:30
#
# Examples:
#
# # Define the clipboard's text
2017-08-17 22:00:37 +05:30
# clipboard_button(text: "Foo")
2015-12-23 02:04:40 +05:30
# # => "<button class='...' data-clipboard-text='Foo'>...</button>"
#
# # Define the target element
2017-08-17 22:00:37 +05:30
# clipboard_button(target: "div#foo")
2015-12-23 02:04:40 +05:30
# # => "<button class='...' data-clipboard-target='div#foo'>...</button>"
#
# See http://clipboardjs.com/#usage
def clipboard_button ( data = { } )
2016-11-03 12:29:30 +05:30
css_class = data [ :class ] || 'btn-clipboard btn-transparent'
2017-08-17 22:00:37 +05:30
title = data [ :title ] || 'Copy to clipboard'
2018-03-17 18:26:18 +05:30
button_text = data [ :button_text ] || ''
hide_tooltip = data [ :hide_tooltip ] || false
hide_button_icon = data [ :hide_button_icon ] || false
2017-08-17 22:00:37 +05:30
# This supports code in app/assets/javascripts/copy_to_clipboard.js that
# works around ClipboardJS limitations to allow the context-specific copy/pasting of plain text or GFM.
if text = data . delete ( :text )
data [ :clipboard_text ] =
if gfm = data . delete ( :gfm )
{ text : text , gfm : gfm }
else
text
end
end
target = data . delete ( :target )
data [ :clipboard_target ] = target if target
2018-03-17 18:26:18 +05:30
unless hide_tooltip
data = { toggle : 'tooltip' , placement : 'bottom' , container : 'body' } . merge ( data )
end
2017-08-17 22:00:37 +05:30
2018-03-17 18:26:18 +05:30
button_attributes = {
2016-11-03 12:29:30 +05:30
class : " btn #{ css_class } " ,
2016-06-22 15:30:34 +05:30
data : data ,
2016-08-24 12:49:21 +05:30
type : :button ,
2017-09-10 17:25:29 +05:30
title : title ,
2018-03-17 18:26:18 +05:30
aria : { label : title }
}
2016-06-22 15:30:34 +05:30
2018-03-17 18:26:18 +05:30
content_tag :button , button_attributes do
concat ( icon ( 'clipboard' , 'aria-hidden' : 'true' ) ) unless hide_button_icon
concat ( button_text )
end
end
2015-12-23 02:04:40 +05:30
2018-03-17 18:26:18 +05:30
def http_clone_button ( project , append_link : true )
2015-12-23 02:04:40 +05:30
protocol = gitlab_config . protocol . upcase
2018-03-17 18:26:18 +05:30
dropdown_description = http_dropdown_description ( protocol )
append_url = project . http_url_to_repo if append_link
dropdown_item_with_description ( protocol , dropdown_description , href : append_url )
end
def http_dropdown_description ( protocol )
if current_user . try ( :require_password_creation_for_git? )
_ ( " Set a password on your account to pull or push via %{protocol}. " ) % { protocol : protocol }
else
_ ( " Create a personal access token on your account to pull or push via %{protocol}. " ) % { protocol : protocol }
end
end
2015-12-23 02:04:40 +05:30
2018-03-17 18:26:18 +05:30
def ssh_clone_button ( project , append_link : true )
dropdown_description = _ ( " You won't be able to pull or push project code via SSH until you add an SSH key to your profile " ) if current_user . try ( :require_ssh_key? )
append_url = project . ssh_url_to_repo if append_link
2017-09-10 17:25:29 +05:30
2018-03-17 18:26:18 +05:30
dropdown_item_with_description ( 'SSH' , dropdown_description , href : append_url )
2015-12-23 02:04:40 +05:30
end
2018-03-17 18:26:18 +05:30
def dropdown_item_with_description ( title , description , href : nil )
button_content = content_tag ( :strong , title , class : 'dropdown-menu-inner-title' )
button_content << content_tag ( :span , description , class : 'dropdown-menu-inner-content' ) if description
2015-12-23 02:04:40 +05:30
2018-03-17 18:26:18 +05:30
content_tag ( href ? :a : :span ) ,
( href ? button_content : title ) ,
class : " #{ title . downcase } -selector " ,
href : ( href if href )
2015-12-23 02:04:40 +05:30
end
end