aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/controllers/clients_controller.rb6
-rw-r--r--app/javascript/controllers/nested_fields_controller.js14
-rw-r--r--app/models/client.rb2
-rw-r--r--app/models/household_member.rb2
-rw-r--r--app/views/clients/new.html.haml34
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