Class: Fluxbit::Component

Inherits:
ViewComponent::Base
  • Object
show all
Includes:
IconHelpers
Defined in:
app/components/fluxbit/component.rb

Defined Under Namespace

Classes: ComponentObj

Instance Method Summary collapse

Methods included from IconHelpers

#chevron_double_left, #chevron_double_right, #chevron_down, #chevron_left, #chevron_right, #chevron_up, #close_icon, #ellipsis_horizontal, #eye_icon, #eye_slash_icon, #plus_icon

Constructor Details

#initialize(**props) ⇒ Component

Returns a new instance of Component.



11
12
13
14
15
16
17
18
19
# File 'app/components/fluxbit/component.rb', line 11

def initialize(**props)
  @popover_placement = props.delete(:popover_placement) || :right
  @popover_trigger = props.delete(:popover_trigger) || :hover # or :click
  @popover_text = props.delete(:popover_text)

  @tooltip_placement = props.delete(:tooltip_placement) || :right
  @tooltip_trigger = props.delete(:tooltip_trigger) || :hover # or :click
  @tooltip_text = props.delete(:tooltip_text)
end

Instance Method Details

#add(to:, first_element: false, **props) ⇒ Object



21
22
23
24
25
26
27
28
29
# File 'app/components/fluxbit/component.rb', line 21

def add(to:, first_element: false, **props)
  unless props[:class].nil?
    to[:class] = (to[:class] || "")
      .split
      .insert((first_element ? 0 : -1), props[:class])
      .join(" ")
  end
  to
end

#add_popover_or_tooltipObject



65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'app/components/fluxbit/component.rb', line 65

def add_popover_or_tooltip
  if popover? || @popover_text.present?
    @props["data-popover-placement"] = @popover_placement
    @props["data-popover-trigger"] = @popover_trigger unless @popover_trigger == :hover
    @props["data-popover-target"] = target
  end

  if tooltip? || @tooltip_text.present?
    @props["data-tooltip-placement"] = @tooltip_placement
    @props["data-tooltip-trigger"] = @tooltip_trigger unless @tooltip_trigger == :hover
    @props["data-tooltip-target"] = target
  end
end

#anyicon(icon, **props) ⇒ Object



86
87
88
# File 'app/components/fluxbit/component.rb', line 86

def anyicon(icon, **props)
  Anyicon::Icon.render(icon, **props)
end

#element_nameObject



102
103
104
105
106
# File 'app/components/fluxbit/component.rb', line 102

def element_name
  self.class.to_s.match(/Fluxbit::(\w+)Component/)[1].underscore
rescue
  "any"
end

#fx_idObject



98
99
100
# File 'app/components/fluxbit/component.rb', line 98

def fx_id
  @fx_id ||= "#{element_name}-#{random_id}"
end

#icon(icon_name, **props) ⇒ Object



90
91
92
# File 'app/components/fluxbit/component.rb', line 90

def icon(icon_name, **props)
  anyicon(icon_name, **props)
end

#options(value, collection: nil, default: nil) ⇒ Object



42
43
44
45
46
47
48
# File 'app/components/fluxbit/component.rb', line 42

def options(value, collection: nil, default: nil)
  if collection.nil?
    value.nil? ? default : value
  else
    value.in?(collection) ? value : default
  end
end

#popover?Boolean

Returns:

  • (Boolean)


57
58
59
# File 'app/components/fluxbit/component.rb', line 57

def popover?
  false # Override in components that support popovers via renders_one :popover
end

#random_idObject



94
95
96
# File 'app/components/fluxbit/component.rb', line 94

def random_id
  (0...30).map { ("a".."z").to_a[rand(26)] }.join
end

#remove_class(elements, from) ⇒ Object



31
32
33
34
35
36
# File 'app/components/fluxbit/component.rb', line 31

def remove_class(elements, from)
  return "" if from.blank?
  return from if elements.blank?

  from.split.reject { |c| c.in?((elements || "").split) }.join(" ")
end

#remove_class_from_props(props) ⇒ Object



38
39
40
# File 'app/components/fluxbit/component.rb', line 38

def remove_class_from_props(props)
  props[:class] = remove_class(props.delete(:remove_class) || "", props[:class])
end

#render_popover_or_tooltipObject



50
51
52
53
54
55
# File 'app/components/fluxbit/component.rb', line 50

def render_popover_or_tooltip
  safe_join [
    (@popover_text.nil? ? "" : Fluxbit::PopoverComponent.new(id: target, **(@popover_props || {})).with_content(@popover_text).render_in(view_context)),
    (@tooltip_text.nil? ? "" : Fluxbit::TooltipComponent.new(id: target, **(@tooltip_props || {})).with_content(@tooltip_text).render_in(view_context))
  ]
end

#targetObject



79
80
81
82
83
84
# File 'app/components/fluxbit/component.rb', line 79

def target
  @popover_target ||= "#{
    @props.try('for') ||
    @props.try(:for) ||
    (0...10).map { ('a'..'z').to_a[rand(26)] }.join}_target"
end

#tooltip?Boolean

Returns:

  • (Boolean)


61
62
63
# File 'app/components/fluxbit/component.rb', line 61

def tooltip?
  false # Override in components that support tooltips via renders_one :tooltip
end