diff --git a/app/components/form_elements/fieldset_toggle_component.html.erb b/app/components/form_elements/fieldset_toggle_component.html.erb index 28549bc..e120f9d 100644 --- a/app/components/form_elements/fieldset_toggle_component.html.erb +++ b/app/components/form_elements/fieldset_toggle_component.html.erb @@ -1,9 +1,23 @@ -<%= tag.public_send(@tag, class: "flex items-center justify-between py-6") do %> +<%= tag.public_send @tag, class: "flex items-center justify-between mb-6 last:mb-0", + data: @form.present? ? { + controller: "settings--toggle", + :'settings--toggle-switch-enabled-value' => @enabled.to_s + } : nil do %>

<%= @descripton %>

- <%= render FormElements::ToggleComponent.new(enabled: @enabled, input_enabled: @input_enabled) %> + <%= render FormElements::ToggleComponent.new( + enabled: @enabled, + input_enabled: @input_enabled, + data: { + :'settings--toggle-target' => "button", + action: "settings--toggle#toggleSwitch" + }) %> + <% if @form.present? %> + <%= @form.hidden_field @attribute, value: @enabled.to_s, + data: { :'settings--toggle-target' => "input" } %> + <% end %>
<% end %> diff --git a/app/components/form_elements/fieldset_toggle_component.rb b/app/components/form_elements/fieldset_toggle_component.rb index aa64535..b38bee7 100644 --- a/app/components/form_elements/fieldset_toggle_component.rb +++ b/app/components/form_elements/fieldset_toggle_component.rb @@ -2,7 +2,10 @@ module FormElements class FieldsetToggleComponent < ViewComponent::Base - def initialize(tag: "li", enabled: false, input_enabled: true, title:, description:) + def initialize(form: nil, attribute: nil, tag: "li", enabled: false, + input_enabled: true, title:, description:) + @form = form + @attribute = attribute @tag = tag @enabled = enabled @input_enabled = input_enabled diff --git a/app/components/form_elements/toggle_component.html.erb b/app/components/form_elements/toggle_component.html.erb index 9023b7f..14f0a81 100644 --- a/app/components/form_elements/toggle_component.html.erb +++ b/app/components/form_elements/toggle_component.html.erb @@ -1,13 +1,15 @@ - +<% end %> diff --git a/app/components/form_elements/toggle_component.rb b/app/components/form_elements/toggle_component.rb index 9702dfb..d5ee036 100644 --- a/app/components/form_elements/toggle_component.rb +++ b/app/components/form_elements/toggle_component.rb @@ -2,9 +2,10 @@ module FormElements class ToggleComponent < ViewComponent::Base - def initialize(enabled:, input_enabled: true) + def initialize(enabled:, input_enabled: true, data: nil) @enabled = !!enabled @input_enabled = input_enabled + @data = data end end end diff --git a/app/javascript/controllers/settings/toggle_controller.js b/app/javascript/controllers/settings/toggle_controller.js new file mode 100644 index 0000000..5c9cff1 --- /dev/null +++ b/app/javascript/controllers/settings/toggle_controller.js @@ -0,0 +1,25 @@ +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + static targets = [ "button", "switch", "input" ] + static values = { switchEnabled: Boolean } + + toggleSwitch () { + this.switchEnabledValue = !this.switchEnabledValue + this.inputTarget.value = this.switchEnabledValue.toString() + + if (this.switchEnabledValue) { + this.buttonTarget.setAttribute("aria-checked", "true"); + this.buttonTarget.classList.remove("bg-gray-200") + this.buttonTarget.classList.add("bg-blue-600") + this.switchTarget.classList.remove("translate-x-0") + this.switchTarget.classList.add("translate-x-5") + } else { + this.buttonTarget.setAttribute("aria-checked", "false"); + this.buttonTarget.classList.remove("bg-blue-600") + this.buttonTarget.classList.add("bg-gray-200") + this.switchTarget.classList.remove("translate-x-5") + this.switchTarget.classList.add("translate-x-0") + } + } +}