Refactor variance chart to make view responsible for sorting measures

This commit is contained in:
Liam Morley 2021-10-28 12:05:41 -04:00
parent f5e5abc27e
commit ad7dd85524
9 changed files with 58 additions and 62 deletions

View file

@ -1,24 +1,16 @@
class DashboardController < SqmApplicationController
def index
@measure_graph_row_presenters = measure_ids
.map { |measure_id| Measure.find_by_measure_id measure_id }
.map(&method(:presenter_for_measure))
.sort
.reverse
@variance_chart_row_presenters = Measure.all.map(&method(:presenter_for_measure))
@category_presenters = SqmCategory.sorted.map { |sqm_category| CategoryPresenter.new(category: sqm_category) }
end
private
def measure_ids
Measure.all.map(&:measure_id)
end
def presenter_for_measure(measure)
score = SurveyItemResponse.score_for_measure(measure: measure, school: @school, academic_year: @academic_year)
MeasureGraphRowPresenter.new(measure: measure, score: score)
VarianceChartRowPresenter.new(measure: measure, score: score)
end
end

View file

@ -42,12 +42,4 @@ module VarianceHelper
def zone_width_percentage
100.0/zones.size
end
def measures_with_insufficient_data(presenters:)
presenters.filter { |presenter| presenter.score == nil }
end
def measures_with_sufficient_data(presenters:)
presenters.filter { |presenter| presenter.score != nil }
end
end

View file

@ -1,4 +1,4 @@
class MeasureGraphRowPresenter
class VarianceChartRowPresenter
include Comparable
attr_reader :score
@ -49,7 +49,7 @@ class MeasureGraphRowPresenter
end
def <=>(other_presenter)
order <=> other_presenter.order
other_presenter.order <=> order
end
private

View file

@ -1,8 +1,10 @@
<% unless measures_with_insufficient_data(presenters: presenters).empty? %>
<p class="caption mb-5">Note: The following measures are not displayed due to limited availability of school admin data and/or low survey response rates: <%= measures_with_insufficient_data(presenters: presenters).map(&:measure_name).join('; ') %>.</p>
<% displayed_presenters = presenters.filter { |p| p.sufficient_data? }.sort %>
<% not_displayed_presenters = presenters - displayed_presenters %>
<% if not_displayed_presenters.present? %>
<p class="caption mb-5">Note: The following measures are not displayed due to limited availability of school admin data and/or low survey response rates: <%= not_displayed_presenters.map(&:measure_name).join('; ') %>.</p>
<% end %>
<% displayed_presenters = measures_with_sufficient_data(presenters: presenters) %>
<svg width="100%" height=<%= graph_height(displayed_presenters.size) %> xmlns="http://www.w3.org/2000/svg">
<filter id="inset-shadow" x="-50%" y="-50%" width="200%" height="200%">
@ -25,7 +27,7 @@
x="<%= label_width_percentage %>%"
y="0"
width="<%= graph_width_percentage %>%"
height=<%= graph_background_height(number_of_rows: displayed_presenters.size) %>
height="<%= graph_background_height(number_of_rows: displayed_presenters.size) %>"
filter="url(#inset-shadow)"
>
<g id="zone-headings">
@ -87,7 +89,7 @@
x="<%= presenter.x_offset %>"
y="<%= index * measure_row_height + (measure_row_height - measure_row_bar_height) / 2 %>"
width="<%= presenter.bar_width %>"
height=<%= measure_row_bar_height %>
height="<%= measure_row_bar_height %>"
data-for-measure-id="<%= presenter.measure_id %>"
stroke="none"
/>

View file

@ -75,5 +75,5 @@
<div class="card">
<h2 class="sub-header-2 mb-4">Distance From Benchmark</h2>
<%= render partial: "variance_graph", locals: { presenters: @measure_graph_row_presenters} %>
<%= render partial: "variance_chart", locals: { presenters: @variance_chart_row_presenters} %>
</div>