feat: show parent scales on variance chart

mciea-main
Nelson Jovel 1 year ago
parent 624ca7a6d0
commit c60281fc9a

@ -173,6 +173,10 @@ class Measure < ActiveRecord::Base
approval_low_benchmark:, ideal_low_benchmark:).zone_for_score(score.average) approval_low_benchmark:, ideal_low_benchmark:).zone_for_score(score.average)
end end
def construct_id
measure_id
end
private private
def any_admin_data_collected?(school:, academic_year:) def any_admin_data_collected?(school:, academic_year:)

@ -42,6 +42,38 @@ class Scale < ApplicationRecord
where("scale_id LIKE 'p-%'") where("scale_id LIKE 'p-%'")
} }
def watch_low_benchmark
survey_items.first.watch_low_benchmark
end
def growth_low_benchmark
survey_items.first.growth_low_benchmark
end
def approval_low_benchmark
survey_items.first.approval_low_benchmark
end
def ideal_low_benchmark
survey_items.first.ideal_low_benchmark
end
def includes_teacher_survey_items?
survey_items.teacher_survey_items.length.positive?
end
def includes_student_survey_items?
survey_items.student_survey_items.length.positive?
end
def includes_admin_data_items?
admin_data_items.length.positive?
end
def construct_id
scale_id
end
private private
def collect_survey_item_average(survey_items, school, academic_year) def collect_survey_item_average(survey_items, school, academic_year)

@ -46,7 +46,7 @@ class Overview::OverviewPresenter
def presenter_for_measure(measure) def presenter_for_measure(measure)
score = measure.score(school: @school, academic_year: @academic_year) score = measure.score(school: @school, academic_year: @academic_year)
Overview::VarianceChartRowPresenter.new(measure:, score:) Overview::VarianceChartRowPresenter.new(construct: measure, score:)
end end
def empty_dataset? def empty_dataset?

@ -12,4 +12,21 @@ class Overview::ParentOverviewPresenter < Overview::OverviewPresenter
def framework_indicator_class def framework_indicator_class
"school-quality-frameworks-parent" "school-quality-frameworks-parent"
end end
def variance_chart_row_presenters
scales.map(&method(:presenter_for_scale))
end
def scales
measures.flat_map { |measure| measure.scales.parent_scales }
end
private
def presenter_for_scale(scale)
score = scale.parent_score(school: @school, academic_year: @academic_year)
score = Score.new(average: score, meets_teacher_threshold: true, meets_student_threshold: true)
Overview::VarianceChartRowPresenter.new(construct: scale, score:)
end
end end

@ -3,16 +3,16 @@
class Overview::VarianceChartRowPresenter class Overview::VarianceChartRowPresenter
include Comparable include Comparable
attr_reader :score, :measure_name, :measure_id, :category attr_reader :score, :construct_name, :construct_id, :category
def initialize(measure:, score:) def initialize(construct:, score:)
@measure = measure @construct = construct
@score = score.average @score = score.average
@meets_teacher_threshold = score.meets_teacher_threshold? @meets_teacher_threshold = score.meets_teacher_threshold?
@meets_student_threshold = score.meets_student_threshold? @meets_student_threshold = score.meets_student_threshold?
@measure_name = @measure.name @construct_name = @construct.name
@measure_id = @measure.measure_id @construct_id = @construct.construct_id
@category = @measure.subcategory.category @category = @construct.category
end end
def sufficient_data? def sufficient_data?
@ -57,9 +57,9 @@ class Overview::VarianceChartRowPresenter
def partial_data_sources def partial_data_sources
[].tap do |sources| [].tap do |sources|
sources << "teacher survey results" if @measure.includes_teacher_survey_items? && !@meets_teacher_threshold sources << "teacher survey results" if @construct.includes_teacher_survey_items? && !@meets_teacher_threshold
sources << "student survey results" if @measure.includes_student_survey_items? && !@meets_student_threshold sources << "student survey results" if @construct.includes_student_survey_items? && !@meets_student_threshold
sources << "administrative data" if @measure.includes_admin_data_items? sources << "administrative data" if @construct.includes_admin_data_items?
end end
end end
@ -106,10 +106,10 @@ class Overview::VarianceChartRowPresenter
def zone def zone
zones = Zones.new( zones = Zones.new(
watch_low_benchmark: @measure.watch_low_benchmark, watch_low_benchmark: @construct.watch_low_benchmark,
growth_low_benchmark: @measure.growth_low_benchmark, growth_low_benchmark: @construct.growth_low_benchmark,
approval_low_benchmark: @measure.approval_low_benchmark, approval_low_benchmark: @construct.approval_low_benchmark,
ideal_low_benchmark: @measure.ideal_low_benchmark ideal_low_benchmark: @construct.ideal_low_benchmark
) )
zones.zone_for_score(@score) zones.zone_for_score(@score)
end end

@ -4,7 +4,7 @@
<% if displayed_presenters.none? %> <% if displayed_presenters.none? %>
<p class="caption mb-5">Note: No measures can be displayed due to limited availability of school data and/or low survey response rates.</p> <p class="caption mb-5">Note: No measures can be displayed due to limited availability of school data and/or low survey response rates.</p>
<% elsif not_displayed_presenters.present? %> <% elsif not_displayed_presenters.present? %>
<p class="caption mb-5">Note: The following measures are not displayed due to limited availability of school data and/or low survey response rates: <%= not_displayed_presenters.map(&:measure_name).join('; ') %>.</p> <p class="caption mb-5">Note: The following measures are not displayed due to limited availability of school data and/or low survey response rates: <%= not_displayed_presenters.map(&:construct_name).join('; ') %>.</p>
<% end %> <% end %>
<svg width="100%" height=<%= graph_height(displayed_presenters.size) %> xmlns="http://www.w3.org/2000/svg"> <svg width="100%" height=<%= graph_height(displayed_presenters.size) %> xmlns="http://www.w3.org/2000/svg">
@ -90,7 +90,7 @@
width="550" width="550"
height="200"> height="200">
<%= link_to(presenter.measure_name, district_school_category_path( @district, @school, presenter.category, {year: @academic_year.range, anchor: "#{presenter.measure_id}"}), class: "measure-row-label") %> <%= link_to(presenter.construct_name, district_school_category_path( @district, @school, presenter.category, {year: @academic_year.range, anchor: "#{presenter.construct_id}"}), class: "measure-row-label") %>
</foreignObject> </foreignObject>
<% end %> <% end %>
@ -120,7 +120,7 @@
y="<%= index * measure_row_height + (measure_row_height - measure_row_bar_height) / 2 %>" y="<%= index * measure_row_height + (measure_row_height - measure_row_bar_height) / 2 %>"
width="<%= presenter.bar_width %>" width="<%= presenter.bar_width %>"
height="<%= measure_row_bar_height %>" height="<%= measure_row_bar_height %>"
data-for-measure-id="<%= presenter.measure_id %>" data-for-measure-id="<%= presenter.construct_id %>"
stroke="none" stroke="none"
/> />
<% end %> <% end %>

@ -30,12 +30,12 @@ describe Overview::VarianceChartRowPresenter do
end end
let(:presenter) do let(:presenter) do
Overview::VarianceChartRowPresenter.new measure:, score: Overview::VarianceChartRowPresenter.new construct: measure, score:
end end
shared_examples_for "measure_name" do shared_examples_for "measure_name" do
it "returns the measure name" do it "returns the measure name" do
expect(presenter.measure_name).to eq "Some Title" expect(presenter.construct_name).to eq "Some Title"
end end
end end
@ -139,7 +139,7 @@ describe Overview::VarianceChartRowPresenter do
let(:score) { Score.new(average: nil, meets_teacher_threshold: false, meets_student_threshold: false) } let(:score) { Score.new(average: nil, meets_teacher_threshold: false, meets_student_threshold: false) }
it "it does not show a partial data indicator" do it "it does not show a partial data indicator" do
presenter_without_admin_data = Overview::VarianceChartRowPresenter.new(measure: measure_without_admin_data_items, presenter_without_admin_data = Overview::VarianceChartRowPresenter.new(construct: measure_without_admin_data_items,
score:) score:)
expect(presenter_without_admin_data.show_partial_data_indicator?).to be false expect(presenter_without_admin_data.show_partial_data_indicator?).to be false
end end
@ -163,7 +163,7 @@ describe Overview::VarianceChartRowPresenter do
growth_low_benchmark:, growth_low_benchmark:,
approval_low_benchmark:, approval_low_benchmark:,
ideal_low_benchmark:) ideal_low_benchmark:)
admin_data_presenter = Overview::VarianceChartRowPresenter.new measure: measure_with_admin_data, admin_data_presenter = Overview::VarianceChartRowPresenter.new construct: measure_with_admin_data,
score: Score.new( score: Score.new(
average: 3.7, meets_teacher_threshold: true, meets_student_threshold: true average: 3.7, meets_teacher_threshold: true, meets_student_threshold: true
) )
@ -236,11 +236,11 @@ describe Overview::VarianceChartRowPresenter do
growth_low_benchmark:, growth_low_benchmark:,
approval_low_benchmark:, approval_low_benchmark:,
ideal_low_benchmark:) ideal_low_benchmark:)
approval_presenter = Overview::VarianceChartRowPresenter.new measure:, approval_presenter = Overview::VarianceChartRowPresenter.new construct: measure,
score: Score.new( score: Score.new(
average: 3.7, meets_teacher_threshold: true, meets_student_threshold: true average: 3.7, meets_teacher_threshold: true, meets_student_threshold: true
) )
ideal_presenter = Overview::VarianceChartRowPresenter.new measure:, ideal_presenter = Overview::VarianceChartRowPresenter.new construct: measure,
score: Score.new( score: Score.new(
average: 4.4, meets_teacher_threshold: true, meets_student_threshold: true average: 4.4, meets_teacher_threshold: true, meets_student_threshold: true
) )
@ -249,11 +249,11 @@ describe Overview::VarianceChartRowPresenter do
end end
it "selects a warning bar below a ideal bar" do it "selects a warning bar below a ideal bar" do
warning_presenter = Overview::VarianceChartRowPresenter.new measure:, warning_presenter = Overview::VarianceChartRowPresenter.new construct: measure,
score: Score.new( score: Score.new(
average: 1.0, meets_teacher_threshold: true, meets_student_threshold: true average: 1.0, meets_teacher_threshold: true, meets_student_threshold: true
) )
ideal_presenter = Overview::VarianceChartRowPresenter.new measure:, ideal_presenter = Overview::VarianceChartRowPresenter.new construct: measure,
score: Score.new( score: Score.new(
average: 5.0, meets_teacher_threshold: true, meets_student_threshold: true average: 5.0, meets_teacher_threshold: true, meets_student_threshold: true
) )

@ -50,16 +50,16 @@ describe "overview/index" do
approval_low_benchmark: 3.5, approval_low_benchmark: 3.5,
ideal_low_benchmark: 4.5) ideal_low_benchmark: 4.5)
[ [
Overview::VarianceChartRowPresenter.new(measure:, Overview::VarianceChartRowPresenter.new(construct: measure,
score: Score.new(average: rand)) score: Score.new(average: rand))
] ]
end end
context "when some presenters have a nil score" do context "when some presenters have a nil score" do
let(:variance_chart_row_presenters) do let(:variance_chart_row_presenters) do
[ [
Overview::VarianceChartRowPresenter.new(measure: support_for_teaching, score: Score.new), Overview::VarianceChartRowPresenter.new(construct: support_for_teaching, score: Score.new),
Overview::VarianceChartRowPresenter.new(measure: effective_leadership, score: Score.new(average: rand)), Overview::VarianceChartRowPresenter.new(construct: effective_leadership, score: Score.new(average: rand)),
Overview::VarianceChartRowPresenter.new(measure: professional_qualifications, score: Score.new) Overview::VarianceChartRowPresenter.new(construct: professional_qualifications, score: Score.new)
] ]
end end

@ -27,8 +27,8 @@ describe "overview/_variance_chart.html.erb" do
before :each do before :each do
presenters = [ presenters = [
Overview::VarianceChartRowPresenter.new(measure: lower_scoring_measure, score: Score.new(average: 1)), Overview::VarianceChartRowPresenter.new(construct: lower_scoring_measure, score: Score.new(average: 1)),
Overview::VarianceChartRowPresenter.new(measure: higher_scoring_measure, score: Score.new(average: 5)) Overview::VarianceChartRowPresenter.new(construct: higher_scoring_measure, score: Score.new(average: 5))
] ]
render partial: "variance_chart", locals: { presenters: } render partial: "variance_chart", locals: { presenters: }
@ -53,8 +53,9 @@ describe "overview/_variance_chart.html.erb" do
measure_lacking_score = create(:measure) measure_lacking_score = create(:measure)
another_measure_lacking_score = create(:measure) another_measure_lacking_score = create(:measure)
presenters = [ presenters = [
Overview::VarianceChartRowPresenter.new(measure: measure_lacking_score, score: Score.new(average: nil)), Overview::VarianceChartRowPresenter.new(construct: measure_lacking_score, score: Score.new(average: nil)),
Overview::VarianceChartRowPresenter.new(measure: another_measure_lacking_score, score: Score.new(average: nil)) Overview::VarianceChartRowPresenter.new(construct: another_measure_lacking_score,
score: Score.new(average: nil))
] ]
render partial: "variance_chart", locals: { presenters: } render partial: "variance_chart", locals: { presenters: }

Loading…
Cancel
Save