diff options
| -rw-r--r-- | app/controllers/clients_controller.rb | 6 | ||||
| -rw-r--r-- | app/javascript/controllers/nested_fields_controller.js | 14 | ||||
| -rw-r--r-- | app/models/client.rb | 2 | ||||
| -rw-r--r-- | app/models/household_member.rb | 2 | ||||
| -rw-r--r-- | app/views/clients/new.html.haml | 34 |
5 files changed, 55 insertions, 3 deletions
diff --git a/app/controllers/clients_controller.rb b/app/controllers/clients_controller.rb index 8ef01bb..72d289e 100644 --- a/app/controllers/clients_controller.rb +++ b/app/controllers/clients_controller.rb @@ -40,6 +40,12 @@ class ClientsController < ApplicationController params.require(:client).permit( :first_name, :last_name, + :mobile_number, + household_members_attributes: [ + :first_name, + :last_name, + :member_type, + ], ) end end diff --git a/app/javascript/controllers/nested_fields_controller.js b/app/javascript/controllers/nested_fields_controller.js new file mode 100644 index 0000000..56f86f5 --- /dev/null +++ b/app/javascript/controllers/nested_fields_controller.js @@ -0,0 +1,14 @@ +import { Controller } from "@hotwired/stimulus" + +// Connects to data-controller="nested-fields" +export default class extends Controller { + static targets = ["fields", "template"]; + + append() { + this.fieldsTarget.insertAdjacentHTML("beforeend", this.#templateContent); + } + + get #templateContent() { + return this.templateTarget.innerHTML.replace(/__INDEX__/g, Date.now()); + } +} diff --git a/app/models/client.rb b/app/models/client.rb index 7cf1c96..f16d382 100644 --- a/app/models/client.rb +++ b/app/models/client.rb @@ -1,4 +1,6 @@ class Client < ApplicationRecord has_many :visits has_many :household_members + + accepts_nested_attributes_for :household_members end diff --git a/app/models/household_member.rb b/app/models/household_member.rb index 212ceb9..6901470 100644 --- a/app/models/household_member.rb +++ b/app/models/household_member.rb @@ -3,4 +3,6 @@ class HouseholdMember < ApplicationRecord # < 2 2-5 6-17 18-59 60+ enum :member_type, %i[ infant toddler child adult senior ] + + MEMBER_TYPES = Hash[HouseholdMember.member_types.keys.map { |v| [v, v] } ] end diff --git a/app/views/clients/new.html.haml b/app/views/clients/new.html.haml index a5d3a51..3667335 100644 --- a/app/views/clients/new.html.haml +++ b/app/views/clients/new.html.haml @@ -2,8 +2,36 @@ %header %b Register a New Client - = simple_form_for @client do |f| - = f.input :first_name - = f.input :last_name + = simple_form_for @client, data: { controller: 'nested-fields' } do |f| + %h3 Client Information + .grid + = f.input :first_name + = f.input :last_name + = f.input :mobile_number + + %h3 Household Members + -# TODO: first_name last_name member_type + %table + %thead + %th First Name + %th Last Name + %th Member Type + + %tbody{ 'data-nested-fields-target': 'fields' } + + %template{ 'data-nested-fields-target': 'template' } + %tr + = simple_fields_for 'client[household_members_attributes][]', HouseholdMember.new, index: '__INDEX__' do |hm_f| + %td + = hm_f.input :first_name, label: false + %td + = hm_f.input :last_name, label: false + %td + = hm_f.collection_radio_buttons :member_type, HouseholdMember::MEMBER_TYPES, :first, :last, label: false + + = button_tag "Add Member", type: :button, data: { action: "nested-fields#append" } + + %br + %br = f.submit |
