Module: BetterUi::General::Components::Input::RadioGroup::RadioGroupHelper

Included in:
ApplicationHelper
Defined in:
app/helpers/better_ui/general/components/input/radio_group/radio_group_helper.rb

Overview

Helper per creare gruppi di radio button Better UI

Instance Method Summary collapse

Instance Method Details

#bui_input_radio_group(name:, options:, selected: nil, theme: :default, size: :medium, rounded: :full, direction: :vertical, required: false, disabled: false, classes: '', form: nil, **html_options) ⇒ String

Genera un gruppo completo di radio button con stili Better UI

Examples:

Gruppo radio base - Selezione genere

bui_input_radio_group(
  name: "gender",
  options: [
    { value: "male", label: "Maschio" },
    { value: "female", label: "Femmina" },
    { value: "other", label: "Altro" }
  ]
)

Gruppo radio con tema e selezione

bui_input_radio_group(
  name: "priority",
  options: [
    { value: "low", label: "Bassa", theme: :green },
    { value: "medium", label: "Media", theme: :yellow },
    { value: "high", label: "Alta", theme: :red }
  ],
  selected: "medium",
  size: :large
)

Gruppo radio orizzontale con Rails form

<%= form_with model: @user do |form| %>
  <%= bui_input_radio_group(
    name: :role,
    options: [
      { value: "admin", label: "Amministratore" },
      { value: "user", label: "Utente" },
      { value: "guest", label: "Ospite" }
    ],
    selected: @user.role,
    direction: :horizontal,
    form: form
  ) %>
<% end %>

Gruppo radio con validazione e attributi HTML

bui_input_radio_group(
  name: "notification_type",
  options: [
    { value: "email", label: "Email" },
    { value: "sms", label: "SMS" },
    { value: "push", label: "Push Notification" }
  ],
  required: true,
  theme: :blue,
  html_options: { data: { action: "change->form#validateNotification" } }
)

Gruppo radio con temi personalizzati per opzione

bui_input_radio_group(
  name: "status",
  options: [
    { value: "active", label: "Attivo", theme: :green },
    { value: "pending", label: "In Sospeso", theme: :yellow },
    { value: "inactive", label: "Inattivo", theme: :red }
  ],
  selected: "active",
  direction: :horizontal
)

Parameters:

  • name (String)

    Nome del campo radio (comune a tutto il gruppo)

  • options (Array<Hash>)

    Array di opzioni per ogni radio button

  • selected (String, nil) (defaults to: nil)

    Valore dell’opzione selezionata

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

    Tema del componente (:default, :white, :red, :rose, :orange, :green, :blue, :yellow, :violet)

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

    Dimensione del componente (:small, :medium, :large)

  • rounded (Symbol) (defaults to: :full)

    Border radius (:none, :small, :medium, :large, :full)

  • direction (Symbol) (defaults to: :vertical)

    Direzione del gruppo (:vertical, :horizontal)

  • required (Boolean) (defaults to: false)

    Se il gruppo è obbligatorio

  • disabled (Boolean) (defaults to: false)

    Se il gruppo è disabilitato

  • classes (String) (defaults to: '')

    Classi CSS aggiuntive per il contenitore

  • form (ActionView::Helpers::FormBuilder, nil) (defaults to: nil)

    Form builder Rails opzionale

  • html_options (Hash)

    Opzioni HTML aggiuntive per ogni radio

Returns:

  • (String)

    HTML del gruppo radio renderizzato



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'app/helpers/better_ui/general/components/input/radio_group/radio_group_helper.rb', line 88

def bui_input_radio_group(name:, options:, selected: nil, theme: :default, size: :medium, 
                         rounded: :full, direction: :vertical, required: false, disabled: false,
                         classes: '', form: nil, **html_options)
  container_classes = [
    'space-y-2',
    direction == :horizontal ? 'flex flex-wrap gap-6' : 'space-y-2',
    classes
  ].compact.join(' ')

  (:div, class: container_classes) do
    options.map do |option|
      option_theme = option[:theme] || theme
      option_classes = option[:classes] || ''
      
      render BetterUi::General::Input::Radio::Component.new(
        name: name,
        value: option[:value],
        label: option[:label],
        checked: selected.to_s == option[:value].to_s,
        theme: option_theme,
        size: size,
        rounded: rounded,
        required: required,
        disabled: disabled || option[:disabled],
        classes: option_classes,
        form: form,
        **html_options
      )
    end.join.html_safe
  end
end