Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/components/pajamas/button_component.rb')
-rw-r--r--app/components/pajamas/button_component.rb118
1 files changed, 118 insertions, 0 deletions
diff --git a/app/components/pajamas/button_component.rb b/app/components/pajamas/button_component.rb
new file mode 100644
index 00000000000..c6193d1ae05
--- /dev/null
+++ b/app/components/pajamas/button_component.rb
@@ -0,0 +1,118 @@
+# 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 [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,
+ 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)
+ @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
+
+ 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 tag
+ @href ? 'a' : 'button'
+ end
+
+ def base_attributes
+ attributes = {}
+
+ attributes['disabled'] = '' if @disabled || @loading
+ attributes['aria-disabled'] = true if @disabled || @loading
+ attributes['type'] = @type unless @href
+
+ attributes
+ end
+ end
+end