Module: MaquinaComponents::ToggleGroupHelper

Defined in:
app/helpers/maquina_components/toggle_group_helper.rb

Overview

Toggle Group Helper

Provides convenient methods for creating toggle group components.

Examples:

Using partials directly

<%%= render "components/toggle_group", type: :single, variant: :outline do %>
  <%%= render "components/toggle_group/item", value: "bold", aria_label: "Toggle bold" do %>
    <%%= icon_for :bold %>
  <%% end %>
<%% end %>

Using the helper with builder

<%%= toggle_group type: :multiple, variant: :outline do |group| %>
  <%% group.item value: "bold", icon: :bold, aria_label: "Toggle bold" %>
  <%% group.item value: "italic", icon: :italic, aria_label: "Toggle italic" %>
<%% end %>

Simple data-driven helper

<%%= toggle_group_simple type: :single, items: [
  { value: "left", icon: :align_left, aria_label: "Align left" },
  { value: "center", icon: :align_center, aria_label: "Align center" },
  { value: "right", icon: :align_right, aria_label: "Align right" }
] %>

Defined Under Namespace

Classes: ToggleGroupBuilder

Instance Method Summary collapse

Instance Method Details

#toggle_group(type: :single, variant: :default, size: :default, value: nil, disabled: false, css_classes: "", **html_options) {|ToggleGroupBuilder| ... } ⇒ String

Renders a toggle group with builder pattern

Parameters:

  • type (Symbol) (defaults to: :single)

    Selection mode (:single, :multiple)

  • variant (Symbol) (defaults to: :default)

    Visual style (:default, :outline)

  • size (Symbol) (defaults to: :default)

    Size variant (:default, :sm, :lg)

  • value (String, Array, nil) (defaults to: nil)

    Initially selected value(s)

  • disabled (Boolean) (defaults to: false)

    Disable all items

  • css_classes (String) (defaults to: "")

    Additional CSS classes

  • html_options (Hash)

    Additional HTML attributes

Yields:

Returns:

  • (String)

    Rendered HTML



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'app/helpers/maquina_components/toggle_group_helper.rb', line 40

def toggle_group(type: :single, variant: :default, size: :default, value: nil, disabled: false, css_classes: "", **html_options, &block)
  builder = ToggleGroupBuilder.new(self, type: type, variant: variant, size: size, value: value, disabled: disabled)

  if block && block.arity == 1
    capture { yield(builder) }
  end

  render "components/toggle_group",
    type: type,
    variant: variant,
    size: size,
    value: value,
    disabled: disabled,
    css_classes: css_classes,
    **html_options do
    if block && block.arity == 1
      builder.to_html
    elsif block
      capture(&block)
    end
  end
end

#toggle_group_simple(items:, type: :single, variant: :default, size: :default, value: nil, disabled: false, css_classes: "", **html_options) ⇒ String

Renders a simple data-driven toggle group

Parameters:

  • type (Symbol) (defaults to: :single)

    Selection mode (:single, :multiple)

  • items (Array<Hash>)

    Array of item configurations

  • variant (Symbol) (defaults to: :default)

    Visual style

  • size (Symbol) (defaults to: :default)

    Size variant

  • value (String, Array, nil) (defaults to: nil)

    Initially selected value(s)

Returns:

  • (String)

    Rendered HTML



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'app/helpers/maquina_components/toggle_group_helper.rb', line 71

def toggle_group_simple(items:, type: :single, variant: :default, size: :default, value: nil, disabled: false, css_classes: "", **html_options)
  selected_values = normalize_value(value)

  render "components/toggle_group",
    type: type,
    variant: variant,
    size: size,
    value: value,
    disabled: disabled,
    css_classes: css_classes,
    **html_options do
    safe_join(items.map do |item|
      item_value = item[:value].to_s
      is_pressed = selected_values.include?(item_value)

      render "components/toggle_group/item",
        value: item_value,
        pressed: is_pressed,
        disabled: item[:disabled] || disabled,
        aria_label: item[:aria_label] do
        parts = []
        parts << icon_for(item[:icon]) if item[:icon] && respond_to?(:icon_for)
        parts << item[:label] if item[:label]
        safe_join(parts)
      end
    end)
  end
end