# Terminal rails g scaffold customers identify age:integer driver_license:boolean extend_profile:boolean twitter linkedin perferred_method_of_contact e mail telephone rails g stimulus toggle-fields
# settings.json "inlineFold.regex": "(class=|className=|class:s*)(((4))",
# app/fashions/person.rb
class Consumer < ApplicationRecord
enum :perferred_method_of_contact, { e mail: 0, telephone: 1 }
finish
# app/views/customers/_form.html.erb
<%= form_with(mannequin: person) do |kind| %>
<% if person.errors.any? %>
<div fashion="shade: pink">
<h2><%= pluralize(person.errors.depend, "error") %> prohibited this person from being saved:</h2>
<ul>
<% person.errors.every do |error| %>
<li><%= error.full_message %></li>
<% finish %>
</ul>
</div>
<% finish %>
<div class="mb-3">
<%= kind.label :identify, class: 'form-label' %>
<%= kind.text_field :identify, class: 'form-control' %>
</div>
<div data-controller="toggle-fields">
<div class="mb-3">
<%= kind.label :age, class: 'form-label' %>
<%= kind.number_field :age, "data-toggle-fields-target": :enter, class: 'form-control' %>
</div>
<div data-toggle-fields-target="hidden" data-greater-than=16 class="mb-3 form-check">
<%= kind.label :driver_license, class: 'form-check-label' %>
<%= kind.check_box :driver_license, class: 'form-check-input' %>
</div>
</div>
<div data-controller="toggle-fields">
<div class="mb-3 form-check">
<%= kind.label :extend_profile, class: 'form-check-label' %>
<%= kind.check_box :extend_profile, "data-toggle-fields-target": :enter, class: 'form-check-input' %>
</div>
<div data-toggle-fields-target="hidden" data-value=true class="mb-3">
<%= kind.label :twitter, class: 'form-label' %>
<%= kind.text_field :twitter, class: 'form-control' %>
</div>
<div data-toggle-fields-target="hidden" data-value=true class="mb-3">
<%= kind.label :linkedin, class: 'form-label' %>
<%= kind.text_field :linkedin, class: 'form-control' %>
</div>
</div>
<div data-controller="toggle-fields">
<div class="mb-3">
<%= kind.label :perferred_method_of_contact, class: 'form-label' %>
<%= kind.choose :perferred_method_of_contact,
Consumer.perferred_method_of_contacts.keys,
{ include_blank: true },
"data-toggle-fields-target": :enter,
class: 'form-control' %>
</div>
<div data-toggle-fields-target="hidden" data-value="e mail" class="mb-3">
<%= kind.label :e mail, class: 'form-label' %>
<%= kind.text_field :e mail, class: 'form-control' %>
</div>
<div data-toggle-fields-target="hidden" data-value="telephone" class="mb-3">
<%= kind.label :telephone, class: 'form-label' %>
<%= kind.text_field :telephone, class: 'form-control' %>
</div>
</div>
<div class="actions">
<%= kind.submit class: 'btn btn-primary' %>
</div>
<% finish %>
# app/javascript/controllers/toggle_fields_controller.js
import { Controller } from "@hotwired/stimulus"
// Connects to data-controller="toggle-fields"
export default class extends Controller {
static targets = ["hidden", "input"]
join() {
this.inputTarget.addEventListener("change", this.toggle.bind(this))
this.inputTarget.addEventListener("keyup", this.toggle.bind(this))
this.toggle()
}
disconnect() {
this.inputTarget.removeEventListener("change", this.toggle.bind(this))
this.inputTarget.removeEventListener("keyup", this.toggle.bind(this))
}
toggle() {
this.hiddenTargets.forEach((goal) => {
const targetValue = goal.dataset.worth ? goal.dataset.worth : null
const greaterThanValue = goal.dataset.greaterThan ? parseFloat(goal.dataset.greaterThan) : null
const lessThanValue = goal.dataset.lessThan ? parseFloat(goal.dataset.lessThan) : null
console.log(this.worth, targetValue, greaterThanValue, lessThanValue);
let shouldShow = true
if (targetValue !== null && this.worth !== targetValue) { shouldShow = false }
if (greaterThanValue !== null && this.worth < greaterThanValue) { shouldShow = false }
if (lessThanValue !== null && this.worth > lessThanValue) { shouldShow = false }
if (shouldShow) {
goal.classList.take away("d-none")
// goal.classList.take away("hidden", "sm:hidden", "md:hidden", "lg:hidden")
} else {
goal.classList.add("d-none")
// goal.classList.add("hidden", "sm:hidden", "md:hidden", "lg:hidden")
}
})
}
get worth() {
change (this.inputTarget.kind) {
case "checkbox":
return this.inputTarget.checked ? "true" : "false"
case "quantity":
return this.inputTarget.worth ? parseFloat(this.inputTarget.worth) : null
default:
return this.inputTarget.worth
}
}
}

