renalware-core 2.0.9 → 2.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/renalware/accesses/dashboards_controller.rb +2 -14
- data/app/mailers/renalware/letters/delivery/practice_mailer.rb +1 -1
- data/app/models/renalware/letters/delivery/email_letter_to_practice.rb +9 -4
- data/app/models/renalware/letters/recipient.rb +15 -0
- data/app/presenters/renalware/accesses/dashboard_presenter.rb +46 -0
- data/app/presenters/renalware/dashboard/dashboard_presenter.rb +5 -1
- data/app/presenters/renalware/hd/protocol_presenter.rb +6 -0
- data/app/presenters/renalware/letters/recipient_presenter.rb +0 -2
- data/app/values/renalware/address.rb +5 -1
- data/app/views/renalware/accesses/dashboards/show.html.slim +19 -13
- data/app/views/renalware/accesses/plans/_summary.html.slim +2 -5
- data/app/views/renalware/accesses/procedures/_form.html.slim +1 -1
- data/app/views/renalware/accesses/procedures/_list.html.slim +4 -4
- data/app/views/renalware/accesses/procedures/edit.html.slim +1 -1
- data/app/views/renalware/accesses/procedures/new.html.slim +1 -1
- data/app/views/renalware/accesses/profiles/_current_profile.html.slim +8 -8
- data/app/views/renalware/accesses/profiles/_form.html.slim +1 -1
- data/app/views/renalware/accesses/profiles/_list.html.slim +4 -4
- data/app/views/renalware/accesses/profiles/edit.html.slim +1 -1
- data/app/views/renalware/accesses/profiles/new.html.slim +1 -1
- data/app/views/renalware/clinical/dry_weights/_form.html.slim +2 -1
- data/app/views/renalware/hd/protocols/_latest_dry_weight.html.slim +13 -0
- data/app/views/renalware/hd/protocols/show.pdf.slim +3 -1
- data/app/views/renalware/letters/formatted_letters/_letter.html.slim +11 -2
- data/config/initializers/devise.rb +1 -1
- data/lib/renalware/version.rb +1 -1
- metadata +4 -5
- data/app/views/renalware/clinical/dry_weights/_dry_weight_nav.html.slim +0 -4
- data/app/views/renalware/clinical/dry_weights/edit.html.slim +0 -9
- data/app/views/renalware/dashboard/dashboards/_side_nav.html.slim +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aaf95664c515c88272128f354f13acdee13fc37b35108a59c0a8717bedafa60b
|
4
|
+
data.tar.gz: 5a6a3748e17a2b5b47e0c130d3959b1d03eeb47be6f00698e3692ac5581668d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2cf400155b462ecc8884cd3746ab505e240d4e1b4d8593745b194675a802969e38d20e42d0b7de45bd3c24280ac6cacdeae9f857accbc0231a7f7fd8734719d
|
7
|
+
data.tar.gz: b9b2881a5e49a90d69d130b2facaa77b8eed767a64f06ed3e00f71723110be2c928daba4c084574265898d5ff93afa6f5336503c483875a0d2af7d0edb71ea9e
|
@@ -3,21 +3,9 @@ require "collection_presenter"
|
|
3
3
|
module Renalware
|
4
4
|
module Accesses
|
5
5
|
class DashboardsController < Accesses::BaseController
|
6
|
-
before_action :load_patient
|
7
|
-
|
8
|
-
# TODO: Wrap these variables in a DashboardPresenter
|
9
6
|
def show
|
10
|
-
|
11
|
-
|
12
|
-
plans = patient.plans.historical.ordered
|
13
|
-
assessments = patient.assessments.ordered
|
14
|
-
|
15
|
-
@profiles = CollectionPresenter.new(profiles, ProfilePresenter)
|
16
|
-
@plans = CollectionPresenter.new(plans, PlanPresenter)
|
17
|
-
@procedures = CollectionPresenter.new(procedures, ProcedurePresenter)
|
18
|
-
@assessments = CollectionPresenter.new(assessments, AssessmentPresenter)
|
19
|
-
@current_profile = ProfilePresenter.new(patient.current_profile)
|
20
|
-
@current_plan = ProfilePresenter.new(patient.current_plan)
|
7
|
+
authorize patient
|
8
|
+
render locals: { dashboard: DashboardPresenter.new(patient) }
|
21
9
|
end
|
22
10
|
end
|
23
11
|
end
|
@@ -6,7 +6,7 @@ module Renalware
|
|
6
6
|
module Letters
|
7
7
|
module Delivery
|
8
8
|
class PracticeMailer < ApplicationMailer
|
9
|
-
def patient_letter(letter:, to:)
|
9
|
+
def patient_letter(letter:, to:, recipient:)
|
10
10
|
validate_letter(letter)
|
11
11
|
letter_presenter = LetterPresenterFactory.new(letter)
|
12
12
|
attachments["letter.pdf"] = Letters::PdfRenderer.call(letter_presenter)
|
@@ -21,16 +21,21 @@ module Renalware
|
|
21
21
|
# false: the patient does not have a practice or the practice has no email address
|
22
22
|
def call
|
23
23
|
return false unless email_letter_to_practice?
|
24
|
-
|
24
|
+
email_letter_to_the_patients_practice
|
25
25
|
true
|
26
26
|
end
|
27
27
|
|
28
28
|
private
|
29
29
|
|
30
|
-
def
|
30
|
+
def email_letter_to_the_patients_practice
|
31
31
|
Letter.transaction do
|
32
|
-
|
33
|
-
|
32
|
+
PracticeMailer.patient_letter(
|
33
|
+
letter: letter,
|
34
|
+
to: practice_email_address,
|
35
|
+
recipient: nil # TODO
|
36
|
+
).deliver_later
|
37
|
+
|
38
|
+
# Flag as sent
|
34
39
|
gp_recipient.update(emailed_at: Time.zone.now)
|
35
40
|
end
|
36
41
|
end
|
@@ -30,6 +30,11 @@ module Renalware
|
|
30
30
|
build_address if address.blank?
|
31
31
|
|
32
32
|
address.copy_from(current_address)
|
33
|
+
# Its possible a migrated address might not have a postcode. Don't let archiving fail
|
34
|
+
# at this stage because of that as the user cannot be informed at this stage
|
35
|
+
# so skip address validation.
|
36
|
+
address.skip_validation = true
|
37
|
+
|
33
38
|
address.save!
|
34
39
|
end
|
35
40
|
|
@@ -44,6 +49,12 @@ module Renalware
|
|
44
49
|
addressee_id == contact.id
|
45
50
|
end
|
46
51
|
|
52
|
+
def statment_to_indicate_letter_will_be_emailed
|
53
|
+
if primary_care_physician? && practice_email_address.present?
|
54
|
+
"VIA EMAIL to #{practice_email_address}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
47
58
|
private
|
48
59
|
|
49
60
|
def address_for_patient
|
@@ -76,6 +87,10 @@ module Renalware
|
|
76
87
|
patient? || primary_care_physician?
|
77
88
|
end
|
78
89
|
|
90
|
+
def practice_email_address
|
91
|
+
@practice_email_address ||= letter.patient&.practice&.email
|
92
|
+
end
|
93
|
+
|
79
94
|
# Make sure we have a 'name' set in the address record set as this is used in the letter
|
80
95
|
# e.g. Roger Robar <- address.name
|
81
96
|
# 123 Toon Town
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_dependency "renalware/accesses"
|
2
|
+
require "attr_extras"
|
3
|
+
|
4
|
+
module Renalware
|
5
|
+
module Accesses
|
6
|
+
class DashboardPresenter
|
7
|
+
attr_reader_initialize :patient
|
8
|
+
|
9
|
+
def profiles
|
10
|
+
@profiles ||= CollectionPresenter.new(
|
11
|
+
patient.profiles.past_and_future.ordered,
|
12
|
+
ProfilePresenter
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def plans
|
17
|
+
@plans ||= CollectionPresenter.new(
|
18
|
+
patient.plans.historical.ordered,
|
19
|
+
PlanPresenter
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
def procedures
|
24
|
+
@procedures ||= CollectionPresenter.new(
|
25
|
+
patient.procedures.ordered,
|
26
|
+
ProcedurePresenter
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
def assessments
|
31
|
+
@assessments ||= CollectionPresenter.new(
|
32
|
+
patient.assessments.ordered,
|
33
|
+
AssessmentPresenter
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
def current_profile
|
38
|
+
@current_profile ||= ProfilePresenter.new(patient.current_profile)
|
39
|
+
end
|
40
|
+
|
41
|
+
def current_plan
|
42
|
+
@current_plan ||= ProfilePresenter.new(patient.current_plan)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -24,8 +24,12 @@ module Renalware
|
|
24
24
|
def letters_in_progress
|
25
25
|
@letters_in_progress ||= begin
|
26
26
|
present_letters(
|
27
|
-
|
27
|
+
Letters::Letter
|
28
|
+
.where("author_id = ? or created_by_id = ?", user.id, user.id)
|
29
|
+
.in_progress
|
30
|
+
.reverse
|
28
31
|
)
|
32
|
+
# Renalware::Letters.cast_author(user)
|
29
33
|
end
|
30
34
|
end
|
31
35
|
|
@@ -16,6 +16,12 @@ module Renalware
|
|
16
16
|
super(view_context)
|
17
17
|
end
|
18
18
|
|
19
|
+
def latest_dry_weight
|
20
|
+
@latest_dry_weight ||= begin
|
21
|
+
Clinical::DryWeight.for_patient(patient).order(assessed_on: :desc).first
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
19
25
|
# TODO: some emerging duplication with HD::DashboardPresenter and forthcoming MDMPresenter?
|
20
26
|
# Could have a base HD presenter or mixin required elements e.g. from concerns
|
21
27
|
def preference_set
|
@@ -23,8 +23,6 @@ module Renalware
|
|
23
23
|
__getobj__.address
|
24
24
|
end
|
25
25
|
|
26
|
-
# @section sub-classes
|
27
|
-
|
28
26
|
# The address for a recipient such as a primary care physician or a patient are
|
29
27
|
# denormalized and stored with the recipient when the letter is archived.
|
30
28
|
# Before the letter is archived, we display the current address directly
|
@@ -3,10 +3,14 @@ module Renalware
|
|
3
3
|
belongs_to :country, class_name: "System::Country"
|
4
4
|
validates :email, email: true, allow_blank: true
|
5
5
|
delegate :uk?, to: :country, allow_nil: true
|
6
|
-
validates_with AddressValidator
|
7
6
|
|
8
7
|
belongs_to :addressable, polymorphic: true
|
9
8
|
|
9
|
+
# Set to true to avoid address validation - useful when archiving a letter with a migrated
|
10
|
+
# address that might not have a postcode for instance
|
11
|
+
attr_accessor :skip_validation
|
12
|
+
validates_with AddressValidator, unless: :skip_validation
|
13
|
+
|
10
14
|
def self.reject_if_blank
|
11
15
|
lambda { |attrs|
|
12
16
|
%w(name organisation_name street_1 street_2 street_3 town county postcode)
|
@@ -1,19 +1,25 @@
|
|
1
1
|
= content_for(:actions) do
|
2
|
-
= render "page_actions", patient:
|
2
|
+
= render "page_actions", patient: dashboard.patient
|
3
3
|
|
4
4
|
= within_patient_layout do
|
5
5
|
.document
|
6
|
-
- if
|
7
|
-
= render "renalware/accesses/profiles/current_profile"
|
8
|
-
|
9
|
-
|
6
|
+
- if dashboard.current_profile.present?
|
7
|
+
= render "renalware/accesses/profiles/current_profile",
|
8
|
+
current_profile: dashboard.current_profile,
|
9
|
+
patient: dashboard.patient
|
10
|
+
- if dashboard.profiles.any?
|
11
|
+
= render "renalware/accesses/profiles/list",
|
12
|
+
patient: dashboard.patient,
|
13
|
+
profiles: dashboard.profiles
|
10
14
|
= render "renalware/accesses/plans/summary",
|
11
|
-
patient:
|
12
|
-
plans:
|
13
|
-
current_plan:
|
14
|
-
- if
|
15
|
-
= render "renalware/accesses/procedures/list"
|
16
|
-
|
15
|
+
patient: dashboard.patient,
|
16
|
+
plans: dashboard.plans,
|
17
|
+
current_plan: dashboard.current_plan
|
18
|
+
- if dashboard.procedures.any?
|
19
|
+
= render "renalware/accesses/procedures/list",
|
20
|
+
patient: dashboard.patient,
|
21
|
+
procedures: dashboard.procedures
|
22
|
+
- if dashboard.assessments.any?
|
17
23
|
= render "renalware/accesses/assessments/list",
|
18
|
-
patient:
|
19
|
-
assessments:
|
24
|
+
patient: dashboard.patient,
|
25
|
+
assessments: dashboard.assessments
|
@@ -4,14 +4,11 @@ article.access-plans
|
|
4
4
|
header
|
5
5
|
h2 Current Access Plan
|
6
6
|
ul
|
7
|
-
/ li= link_to "Create",
|
8
|
-
new_patient_accesses_plan_path(@patient),
|
9
|
-
class: "button"
|
10
7
|
li= link_to "Edit",
|
11
|
-
edit_patient_accesses_plan_path(
|
8
|
+
edit_patient_accesses_plan_path(patient, current_plan),
|
12
9
|
class: "button"
|
13
10
|
li= link_to "View",
|
14
|
-
patient_accesses_plan_path(
|
11
|
+
patient_accesses_plan_path(patient, current_plan),
|
15
12
|
class: "button secondary"
|
16
13
|
.current-access-plan
|
17
14
|
= render "renalware/accesses/plans/details", plan: current_plan
|
@@ -2,7 +2,7 @@ article.access-procedures
|
|
2
2
|
header
|
3
3
|
h2 Procedure History
|
4
4
|
= link_to "Add Procedure",
|
5
|
-
new_patient_accesses_procedure_path(
|
5
|
+
new_patient_accesses_procedure_path(patient),
|
6
6
|
class: "button"
|
7
7
|
|
8
8
|
table.auto-layout
|
@@ -17,12 +17,12 @@ article.access-procedures
|
|
17
17
|
th Outcome
|
18
18
|
|
19
19
|
tbody
|
20
|
-
-
|
20
|
+
- procedures.each do |procedure|
|
21
21
|
tr
|
22
22
|
td
|
23
|
-
= link_to "View", patient_accesses_procedure_path(
|
23
|
+
= link_to "View", patient_accesses_procedure_path(patient, procedure)
|
24
24
|
= pipe_separator
|
25
|
-
= link_to "Edit", edit_patient_accesses_procedure_path(
|
25
|
+
= link_to "Edit", edit_patient_accesses_procedure_path(patient, procedure)
|
26
26
|
td= procedure.performed_on
|
27
27
|
td= procedure.type&.long_name
|
28
28
|
td= procedure.side
|
@@ -1,24 +1,24 @@
|
|
1
|
-
- return if
|
1
|
+
- return if current_profile.blank?
|
2
2
|
|
3
3
|
article
|
4
4
|
header
|
5
5
|
h2 Current Access Profile
|
6
6
|
ul
|
7
7
|
li= link_to "Edit",
|
8
|
-
edit_patient_accesses_profile_path(
|
8
|
+
edit_patient_accesses_profile_path(patient, current_profile),
|
9
9
|
class: "button"
|
10
10
|
li= link_to "View",
|
11
|
-
patient_accesses_profile_path(
|
11
|
+
patient_accesses_profile_path(patient, current_profile),
|
12
12
|
class: "button secondary"
|
13
13
|
|
14
14
|
dl.dl-horizontal
|
15
15
|
dt Formed On:
|
16
|
-
dd=
|
16
|
+
dd= current_profile.formed_on
|
17
17
|
dt Type:
|
18
|
-
dd=
|
18
|
+
dd= current_profile.type
|
19
19
|
dt Side:
|
20
|
-
dd=
|
20
|
+
dd= current_profile.side
|
21
21
|
dt Start Date:
|
22
|
-
dd=
|
22
|
+
dd= current_profile.started_on
|
23
23
|
dt Notes:
|
24
|
-
dd= simple_format
|
24
|
+
dd= simple_format current_profile.notes
|
@@ -2,7 +2,7 @@ article.access-profiles
|
|
2
2
|
header
|
3
3
|
h2 Access Profile History
|
4
4
|
= link_to "Add Profile",
|
5
|
-
new_patient_accesses_profile_path(
|
5
|
+
new_patient_accesses_profile_path(patient),
|
6
6
|
class: "button"
|
7
7
|
|
8
8
|
table.auto-layout
|
@@ -15,12 +15,12 @@ article.access-profiles
|
|
15
15
|
th.col-width-small Side
|
16
16
|
|
17
17
|
tbody
|
18
|
-
-
|
18
|
+
- profiles.each do |profile|
|
19
19
|
tr
|
20
20
|
td
|
21
|
-
= link_to "View", patient_accesses_profile_path(
|
21
|
+
= link_to "View", patient_accesses_profile_path(patient, profile)
|
22
22
|
= pipe_separator
|
23
|
-
= link_to "Edit", edit_patient_accesses_profile_path(
|
23
|
+
= link_to "Edit", edit_patient_accesses_profile_path(patient, profile)
|
24
24
|
td= profile.formed_on
|
25
25
|
td= profile.started_on
|
26
26
|
td= profile.terminated_on
|
@@ -23,7 +23,9 @@
|
|
23
23
|
td= render "profile", profile: protocol.profile
|
24
24
|
td= render "allergies", patient: protocol.patient
|
25
25
|
td= render "prescriptions", prescriptions: protocol.prescriptions
|
26
|
-
td
|
26
|
+
td
|
27
|
+
= render "recent_pathology", recent_pathology: protocol.recent_pathology
|
28
|
+
= render "latest_dry_weight", latest_dry_weight: protocol.latest_dry_weight
|
27
29
|
|
28
30
|
.row.collapse
|
29
31
|
.small-12.columns
|
@@ -285,7 +285,12 @@ scss:
|
|
285
285
|
p Private and confidential
|
286
286
|
|
287
287
|
.address
|
288
|
-
p
|
288
|
+
p
|
289
|
+
= letter.main_recipient.to_html
|
290
|
+
- email_statement = letter.main_recipient.statment_to_indicate_letter_will_be_emailed
|
291
|
+
- if email_statement.present?
|
292
|
+
br
|
293
|
+
= email_statement
|
289
294
|
|
290
295
|
.unit-block
|
291
296
|
span.nhs-logo
|
@@ -334,4 +339,8 @@ scss:
|
|
334
339
|
|
335
340
|
- letter.cc_recipients.each do |cc|
|
336
341
|
.address.nobreak
|
337
|
-
p
|
342
|
+
p
|
343
|
+
= cc.to_html
|
344
|
+
- if cc.statment_to_indicate_letter_will_be_emailed.present?
|
345
|
+
br
|
346
|
+
= cc.statment_to_indicate_letter_will_be_emailed
|
@@ -154,7 +154,7 @@ Devise.setup do |config|
|
|
154
154
|
# ==> Configuration for :timeoutable
|
155
155
|
# The time you want to timeout the user session without activity. After this
|
156
156
|
# time the user will be asked for credentials again. Default is 30 minutes.
|
157
|
-
config.timeout_in = Rails.application.secrets.fetch(:session_timeout,
|
157
|
+
config.timeout_in = Rails.application.secrets.fetch(:session_timeout, 30).minutes
|
158
158
|
|
159
159
|
# If true, expires auth token on session timeout.
|
160
160
|
# config.expire_auth_token_on_timeout = false
|
data/lib/renalware/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: renalware-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Airslie
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-03-
|
11
|
+
date: 2018-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -1800,6 +1800,7 @@ files:
|
|
1800
1800
|
- app/presenters/false_class_presenter.rb
|
1801
1801
|
- app/presenters/presenter.rb
|
1802
1802
|
- app/presenters/renalware/accesses/assessment_presenter.rb
|
1803
|
+
- app/presenters/renalware/accesses/dashboard_presenter.rb
|
1803
1804
|
- app/presenters/renalware/accesses/patient_presenter.rb
|
1804
1805
|
- app/presenters/renalware/accesses/plan_presenter.rb
|
1805
1806
|
- app/presenters/renalware/accesses/procedure_presenter.rb
|
@@ -2022,10 +2023,8 @@ files:
|
|
2022
2023
|
- app/views/renalware/clinical/body_compositions/new.html.slim
|
2023
2024
|
- app/views/renalware/clinical/body_compositions/show.html.slim
|
2024
2025
|
- app/views/renalware/clinical/dry_weights/_dry_weight.html.slim
|
2025
|
-
- app/views/renalware/clinical/dry_weights/_dry_weight_nav.html.slim
|
2026
2026
|
- app/views/renalware/clinical/dry_weights/_form.html.slim
|
2027
2027
|
- app/views/renalware/clinical/dry_weights/_list.html.slim
|
2028
|
-
- app/views/renalware/clinical/dry_weights/edit.html.slim
|
2029
2028
|
- app/views/renalware/clinical/dry_weights/index.html.slim
|
2030
2029
|
- app/views/renalware/clinical/dry_weights/new.html.slim
|
2031
2030
|
- app/views/renalware/clinical/profiles/edit.html.slim
|
@@ -2046,7 +2045,6 @@ files:
|
|
2046
2045
|
- app/views/renalware/dashboard/bookmarks/_table.html.slim
|
2047
2046
|
- app/views/renalware/dashboard/dashboards/_content.html.slim
|
2048
2047
|
- app/views/renalware/dashboard/dashboards/_layout.html.slim
|
2049
|
-
- app/views/renalware/dashboard/dashboards/_side_nav.html.slim
|
2050
2048
|
- app/views/renalware/dashboard/dashboards/show.html.slim
|
2051
2049
|
- app/views/renalware/dashboard/letters/_letter.html.slim
|
2052
2050
|
- app/views/renalware/dashboard/letters/_table.html.slim
|
@@ -2161,6 +2159,7 @@ files:
|
|
2161
2159
|
- app/views/renalware/hd/preference_sets/_summary.html.slim
|
2162
2160
|
- app/views/renalware/hd/preference_sets/edit.html.slim
|
2163
2161
|
- app/views/renalware/hd/protocols/_allergies.html.slim
|
2162
|
+
- app/views/renalware/hd/protocols/_latest_dry_weight.html.slim
|
2164
2163
|
- app/views/renalware/hd/protocols/_prescriptions.html.slim
|
2165
2164
|
- app/views/renalware/hd/protocols/_profile.html.slim
|
2166
2165
|
- app/views/renalware/hd/protocols/_recent_pathology.html.slim
|
@@ -1,9 +0,0 @@
|
|
1
|
-
= within_patient_layout(title: "Dry Weight") do
|
2
|
-
= render "dry_weight_nav"
|
3
|
-
|
4
|
-
.document
|
5
|
-
= simple_form_for @dry_weight,
|
6
|
-
url: patient_hd_dry_weight_path(@patient, @dry_weight),
|
7
|
-
html: { autocomplete: "off" },
|
8
|
-
wrapper: "horizontal_form" do |f|
|
9
|
-
= render "form", f: f
|