Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 27 additions & 63 deletions app/components/app_patient_table_component.html.erb
Original file line number Diff line number Diff line change
@@ -1,72 +1,36 @@
<div class="app-patients">
<% if @section != :matching %>
<%= form_with url: form_url,
method: :get,
class: "app-patients__filters",
data: { module: "autosubmit",
turbo: "true",
turbo_action: "replace" },
builder: GOVUKDesignSystemFormBuilder::FormBuilder do |f| %>
<%= f.govuk_fieldset legend: { text: "Filter results", size: "s" } do %>
<%= f.govuk_text_field :name, label: { text: "By name" },
value: params[:name],
autocomplete: "off",
"data-autosubmit-target": "field",
"data-action": "autosubmit#submit",
"data-turbo-permanent": "true" %>
<%= f.govuk_text_field :dob, label: { text: "By date of birth" },
hint: {
text: "e.g. 2005 or 01/03/2014",
class: "nhsuk-u-font-size-16",
},
value: params[:dob],
"data-autosubmit-target": "field",
"data-action": "autosubmit#submit",
"data-turbo-permanent": "true" %>
<%= f.hidden_field :sort, value: params[:sort] %>
<%= f.hidden_field :direction, value: params[:direction] %>
<%= f.govuk_submit "Reset filters", type: "reset",
secondary: true,
"data-autosubmit-target": "reset",
"data-action": "autosubmit#submit",
"data-turbo-permanent": "true",
class: %w[nhsuk-u-display-block
app-button--small] %>
<%= f.govuk_submit "Filter", "data-autosubmit-target": "filter",
"data-turbo-permanent": "true" %>
<div class="nhsuk-table__panel-with-heading-tab">
<h3 class="nhsuk-table__heading-tab"><%= heading %></h3>
<%= govuk_table(html_attributes: { class: "nhsuk-table-responsive" }) do |table| %>
<% table.with_head do |head| %>
<% head.with_row do |row| %>
<% row.with_cell(text: "Full name") %>
<% row.with_cell(text: "NHS number") %>
<% row.with_cell(text: "Date of birth") %>
<% row.with_cell(text: "Outcome") %>
<% end %>
<% end %>
<% end %>

<%= govuk_table(classes: "app-patients__table nhsuk-table-responsive") do |table| %>
<%= table.with_caption(text: @caption, html_attributes: {
class: %w[nhsuk-u-secondary-text-color
nhsuk-u-font-weight-normal
nhsuk-u-font-size-19],
}) %>
<% table.with_body do |body| %>
<% patients.each do |patient| %>
<% body.with_row do |row| %>
<% row.with_cell do %>
<span class="nhsuk-table-responsive__heading">Full name</span>
<%= govuk_link_to patient.full_name, href_for(patient:) %>
<% end %>

<%= table.with_head do |head| %>
<% if @patient_sessions.any? %>
<%= head.with_row do |row| %>
<%= @columns.each do |column| %>
<%= row.with_cell(**header_attributes(column)) do %>
<%= header_link(column) %>
<% end %>
<% row.with_cell do %>
<span class="nhsuk-table-responsive__heading">NHS number</span>
<%= helpers.format_nhs_number(patient.nhs_number) %>
<% end %>

<% row.with_cell do %>
<span class="nhsuk-table-responsive__heading">Date of birth</span>
<%= patient.date_of_birth.to_fs(:long) %>
<% end %>
<% end %>
<% end %>
<% end %>

<%= table.with_body do |body| %>
<%= @patient_sessions.each do |patient_session| %>
<%= body.with_row do |row| %>
<%= @columns.each do |column| %>
<%= row.with_cell do %>
<span class="nhsuk-table-responsive__heading">
<%= column_name(column) %>
</span>
<%= column_value(patient_session, column) %>
<% end %>
<% row.with_cell do %>
<span class="nhsuk-table-responsive__heading">Outcome</span>
<%= outcome_for(patient:) %>
<% end %>
<% end %>
<% end %>
Expand Down
155 changes: 28 additions & 127 deletions app/components/app_patient_table_component.rb
Original file line number Diff line number Diff line change
@@ -1,149 +1,50 @@
# frozen_string_literal: true

class AppPatientTableComponent < ViewComponent::Base
attr_reader :params

def initialize(
patient_sessions:,
section:,
caption: nil,
columns: %i[name dob],
consent_form: nil,
params: {}
)
def initialize(patients, campaign:)
super

@patient_sessions = patient_sessions
@columns = columns
@section = section
@caption = caption
@consent_form = consent_form
@params = params
@patients = patients
@campaign = campaign
end

private

def column_name(column)
{
action: "Action needed",
name: "Full name",
dob: "Date of birth",
reason: "Reason for refusal",
outcome: "Outcome",
postcode: "Postcode",
select_for_matching: "Action"
}[
column
]
end
attr_reader :patients, :campaign

def column_value(patient_session, column)
case column
when :action, :outcome
t("patient_session_statuses.#{patient_session.state}.text")
when :name
name_cell(patient_session)
when :dob
patient_session.patient.date_of_birth.to_fs(:long)
when :reason
patient_session
.consents
.map { |c| c.human_enum_name(:reason_for_refusal) }
.uniq
.join("<br />")
.html_safe
when :postcode
patient_session.patient.address_postcode
when :select_for_matching
matching_link(patient_session)
else
raise ArgumentError, "Unknown column: #{column}"
end
def heading
"#{pluralize(patients.count, "child")} in this programme’s cohort"
end

def name_cell(patient_session)
safe_join(
[
patient_link(patient_session),
(
if patient_session.patient.common_name.present?
"<span class=\"nhsuk-u-font-size-16\">Known as: ".html_safe +
patient_session.patient.common_name + "</span>".html_safe
end
)
].compact,
tag.br
)
end

def patient_link(patient_session)
case @section
when :matching
patient_session.patient.full_name
def outcome_for(patient:)
patient_session = patient_session_for(patient:)
if patient_session.vaccination_administered?
govuk_tag(text: "Vaccinated", colour: "green")
elsif patient_session.vaccination_not_administered?
govuk_tag(text: "Could not vaccinate", colour: "red")
else
govuk_link_to patient_session.patient.full_name,
session_patient_path(
patient_session.session,
patient_session.patient,
section: params[:section],
tab: params[:tab]
)
govuk_tag(text: "No outcome yet", colour: "grey")
end
end

def matching_link(patient_session)
govuk_button_link_to(
"Select",
review_match_consent_form_path(
@consent_form.id,
patient_session_id: patient_session.id
),
secondary: true,
class: "app-button--small"
)
end
def href_for(patient:)
patient_session = patient_session_for(patient:)
session = patient_session.session

def header_link(column)
case @section
when :matching
column_name(column)
else
direction =
if params[:sort] == column.to_s && params[:direction] == "asc"
"desc"
else
"asc"
end
data = { turbo: "true", turbo_action: "replace" }
link_to column_name(column),
session_section_tab_path(
session_id: params[:session_id],
section: params[:section],
tab: params[:tab],
sort: column,
direction:,
name: params[:name],
dob: params[:dob]
),
data:
end
end
tab =
if patient_session.vaccination_administered?
"vaccinated"
elsif patient_session.vaccination_not_administered?
"could-not"
else
"vaccinate"
end

def form_url
session_section_tab_path(
session_id: params[:session_id],
section: params[:section],
tab: params[:tab]
)
session_patient_path(session, patient, section: "vaccinations", tab:)
end

def header_attributes(column)
sort =
if params[:sort] == column.to_s
params[:direction] == "asc" ? "ascending" : "descending"
else
"none"
end
{ html_attributes: { aria: { sort: } } }
def patient_session_for(patient:)
# TODO: handle multiple patient sessions
campaign.patient_sessions.active.order(:created_at).find_by(patient:)
end
end
75 changes: 75 additions & 0 deletions app/components/app_session_patient_table_component.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<div class="app-patients">
<% if @section != :matching %>
<%= form_with url: form_url,
method: :get,
class: "app-patients__filters",
data: { module: "autosubmit",
turbo: "true",
turbo_action: "replace" },
builder: GOVUKDesignSystemFormBuilder::FormBuilder do |f| %>
<%= f.govuk_fieldset legend: { text: "Filter results", size: "s" } do %>
<%= f.govuk_text_field :name, label: { text: "By name" },
value: params[:name],
autocomplete: "off",
"data-autosubmit-target": "field",
"data-action": "autosubmit#submit",
"data-turbo-permanent": "true" %>
<%= f.govuk_text_field :dob, label: { text: "By date of birth" },
hint: {
text: "e.g. 2005 or 01/03/2014",
class: "nhsuk-u-font-size-16",
},
value: params[:dob],
"data-autosubmit-target": "field",
"data-action": "autosubmit#submit",
"data-turbo-permanent": "true" %>
<%= f.hidden_field :sort, value: params[:sort] %>
<%= f.hidden_field :direction, value: params[:direction] %>
<%= f.govuk_submit "Reset filters", type: "reset",
secondary: true,
"data-autosubmit-target": "reset",
"data-action": "autosubmit#submit",
"data-turbo-permanent": "true",
class: %w[nhsuk-u-display-block
app-button--small] %>
<%= f.govuk_submit "Filter", "data-autosubmit-target": "filter",
"data-turbo-permanent": "true" %>
<% end %>
<% end %>
<% end %>

<%= govuk_table(classes: "app-patients__table nhsuk-table-responsive") do |table| %>
<%= table.with_caption(text: @caption, html_attributes: {
class: %w[nhsuk-u-secondary-text-color
nhsuk-u-font-weight-normal
nhsuk-u-font-size-19],
}) %>

<%= table.with_head do |head| %>
<% if @patient_sessions.any? %>
<%= head.with_row do |row| %>
<%= @columns.each do |column| %>
<%= row.with_cell(**header_attributes(column)) do %>
<%= header_link(column) %>
<% end %>
<% end %>
<% end %>
<% end %>
<% end %>

<%= table.with_body do |body| %>
<%= @patient_sessions.each do |patient_session| %>
<%= body.with_row do |row| %>
<%= @columns.each do |column| %>
<%= row.with_cell do %>
<span class="nhsuk-table-responsive__heading">
<%= column_name(column) %>
</span>
<%= column_value(patient_session, column) %>
<% end %>
<% end %>
<% end %>
<% end %>
<% end %>
<% end %>
</div>
Loading