gitlab-org--gitlab-foss/app/components/pajamas/button_component.rb

122 lines
3.3 KiB
Ruby

# frozen_string_literal: true
module Pajamas
class ButtonComponent < Pajamas::Component
# @param [Symbol] category
# @param [Symbol] variant
# @param [Symbol] size
# @param [Symbol] type
# @param [Boolean] disabled
# @param [Boolean] loading
# @param [Boolean] block
# @param [Boolean] selected
# @param [String] icon
# @param [String] href
# @param [String] target
# @param [Symbol] method
# @param [Hash] button_options
# @param [String] button_text_classes
# @param [String] icon_classes
def initialize(
category: :primary,
variant: :default,
size: :medium,
type: :button,
disabled: false,
loading: false,
block: false,
selected: false,
icon: nil,
href: nil,
target: nil,
method: nil,
button_options: {},
button_text_classes: nil,
icon_classes: nil
)
@category = filter_attribute(category.to_sym, CATEGORY_OPTIONS)
@variant = filter_attribute(variant.to_sym, VARIANT_OPTIONS)
@size = filter_attribute(size.to_sym, SIZE_OPTIONS)
@type = filter_attribute(type.to_sym, TYPE_OPTIONS, default: :button)
@disabled = disabled
@loading = loading
@block = block
@selected = selected
@icon = icon
@href = href
@target = filter_attribute(target, TARGET_OPTIONS)
@method = filter_attribute(method, METHOD_OPTIONS)
@button_options = button_options
@button_text_classes = button_text_classes
@icon_classes = icon_classes
end
private
def button_class
classes = ['gl-button btn']
classes.push('disabled') if @disabled || @loading
classes.push('selected') if @selected
classes.push('btn-block') if @block
classes.push('btn-icon') if @icon && !content
classes.push(SIZE_CLASSES[@size])
classes.push(VARIANT_CLASSES[@variant])
unless NON_CATEGORY_VARIANTS.include?(@variant) || @category == :primary
classes.push(VARIANT_CLASSES[@variant] + '-' + CATEGORY_CLASSES[@category])
end
classes.push(@button_options[:class])
classes.join(' ')
end
CATEGORY_OPTIONS = [:primary, :secondary, :tertiary].freeze
VARIANT_OPTIONS = [:default, :confirm, :danger, :dashed, :link, :reset].freeze
SIZE_OPTIONS = [:small, :medium].freeze
TYPE_OPTIONS = [:button, :reset, :submit].freeze
TARGET_OPTIONS = %w[_self _blank _parent _top].freeze
METHOD_OPTIONS = [:get, :post, :put, :delete, :patch].freeze
CATEGORY_CLASSES = {
primary: '',
secondary: 'secondary',
tertiary: 'tertiary'
}.freeze
VARIANT_CLASSES = {
default: 'btn-default',
confirm: 'btn-confirm',
danger: 'btn-danger',
dashed: 'btn-dashed',
link: 'btn-link',
reset: 'btn-gl-reset'
}.freeze
NON_CATEGORY_VARIANTS = [:dashed, :link, :reset].freeze
SIZE_CLASSES = {
small: 'btn-sm',
medium: 'btn-md'
}.freeze
delegate :sprite_icon, to: :helpers
delegate :gl_loading_icon, to: :helpers
def link?
@href.present?
end
def base_attributes
attributes = {}
attributes['disabled'] = 'disabled' if @disabled || @loading
attributes['aria-disabled'] = true if @disabled || @loading
attributes['type'] = @type unless @href
attributes
end
end
end