class BootstrapBuilders::Button

Attributes

label[RW]

Public Class Methods

new(args) click to toggle source
# File lib/bootstrap_builders/button.rb, line 22
def initialize(args)
  @args = args
  @label = args[:label]
  @class = args[:class]
  @url = args.fetch(:url)
  @args = args
  @context = args.fetch(:context)
  @icon = args[:icon]
  @can = args[:can]
  @mini = args[:mini]

  @data = args[:data] || {}
  @data[:bb_icon] = @icon.present?

  @args[:title] ||= @label if @args[:responsive] && @label.present?
end
parse_url_args(args) click to toggle source
# File lib/bootstrap_builders/button.rb, line 4
def self.parse_url_args(args)
  args_parser = BootstrapBuilders::ArgumentsParser.new(
    arguments: args,
    short_true_arguments: [
      :block, :confirm, :danger, :disabled, :info, :link, :primary, :remote, :responsive, :warning, :lg, :md, :mini, :sm, :xs
    ]
  )
  args = args_parser.arguments

  is_an_active_record = BootstrapBuilders::IsAChecker.is_a?(args.first, "ActiveRecord::Base")
  is_a_baza_model = BootstrapBuilders::IsAChecker.is_a?(args.first, "BazaModels::Model")

  args_parser.arguments_hash[:url] ||= args.shift if args.first.is_a?(Array) || args.first.is_a?(String) || is_an_active_record || is_a_baza_model

  args_parser.arguments_hash[:label] ||= args.shift if args.first.is_a?(String)
  args_parser.arguments_hash
end

Public Instance Methods

can_model() click to toggle source
# File lib/bootstrap_builders/button.rb, line 90
def can_model
  can_object unless @can_model
  @can_model
end
can_model_class() click to toggle source
# File lib/bootstrap_builders/button.rb, line 95
def can_model_class
  can_object unless @can_model_class
  @can_model_class
end
classes() click to toggle source
# File lib/bootstrap_builders/button.rb, line 39
def classes
  unless @classes
    @classes = BootstrapBuilders::ClassAttributeHandler.new(class: ["btn"])
    handle_mini_argument
    @classes.add(@class) if @class
    @classes.add("bb-btn-responsive") if @args[:responsive]
    add_default_as_default
    @classes.add("btn-block") if @args[:block]
    @classes.add("btn-danger") if @args[:danger]
    @classes.add("btn-info") if @args[:info]
    @classes.add("btn-link") if @args[:link]
    @classes.add("btn-primary") if @args[:primary]
    @classes.add("btn-warning") if @args[:warning]

    size_classes = [:lg, :md, :sm, :xs]
    size_classes.each do |size_class|
      next unless @args[size_class]
      btn_size_class = "btn-#{size_class}"
      @classes.add(btn_size_class) unless @classes.include?(btn_size_class)
    end
  end

  @classes
end
html() click to toggle source
# File lib/bootstrap_builders/button.rb, line 64
def html
  return unless can?

  handle_confirm_argument

  link_args = {
    class: classes.classes,
    data: @data,
    method: @args[:method],
    target: @args[:target],
    remote: @args[:remote],
    title: @args[:title]
  }

  link_args[:disabled] = true if @args[:disabled]

  @context.link_to(@url, link_args) do
    html = ""
    html << @context.content_tag(:i, nil, class: ["fa", "fa-#{@icon}"]) if @icon

    html << @context.content_tag(:span, " #{@label}", class: "bb-btn-label") if @label && !@mini

    html.strip.html_safe # rubocop:disable Rails/OutputSafety
  end
end

Private Instance Methods

add_default_as_default() click to toggle source
# File lib/bootstrap_builders/button.rb, line 102
def add_default_as_default
  @classes.add("btn-default") if !@args[:danger] && !@args[:info] && !@args[:primary] && !@args[:warning]
end
can?() click to toggle source
# File lib/bootstrap_builders/button.rb, line 106
def can?
  authorize_object = can_object
  return true if !authorize_object || !@args[:can_type]
  @context.can? @args.fetch(:can_type), authorize_object
end
can_object() click to toggle source
# File lib/bootstrap_builders/button.rb, line 112
def can_object
  if !@can_object && @can_object != false
    if @can
      can_object_from_given_can_argument
    elsif @url
      can_object_from_url
    end

    @can_object ||= false
  end

  @can_object
end
can_object_from_given_can_argument() click to toggle source
# File lib/bootstrap_builders/button.rb, line 151
def can_object_from_given_can_argument
  if @can.is_a?(Class)
    model_class = @can
  else
    model_class = @can.class
  end

  ancestors = model_class.ancestors.map(&:name)

  if ancestors.include?("ActiveRecord::Base") || ancestors.include?("BazaModels::Model")
    @can_object = @can
    @can_model = @can unless @can.is_a?(Class)
    @can_model_class = model_class
  end
end
can_object_from_url() click to toggle source
# File lib/bootstrap_builders/button.rb, line 126
def can_object_from_url
  url = @url.clone

  if url.is_a?(Array)
    url.pop if url.last.is_a?(Hash)
    last_element_in_url = url.last
  else
    last_element_in_url = url
  end

  if last_element_in_url.is_a?(Class)
    model_class = last_element_in_url
  else
    model_class = last_element_in_url.class
  end

  ancestors = model_class.ancestors.map(&:name)

  if ancestors.include?("ActiveRecord::Base") || ancestors.include?("BazaModels::Model")
    @can_object = last_element_in_url
    @can_model = last_element_in_url unless last_element_in_url.is_a?(Class)
    @can_model_class = model_class
  end
end
handle_confirm_argument() click to toggle source
# File lib/bootstrap_builders/button.rb, line 167
def handle_confirm_argument
  return unless @args[:confirm]
  @data[:confirm] = I18n.t("are_you_sure")
end
handle_mini_argument() click to toggle source
# File lib/bootstrap_builders/button.rb, line 172
def handle_mini_argument
  return unless @mini
  @classes.add(["bb-btn-mini", "btn-xs"])
end