From aa4ce86eaaf129c63a7a7c988e959b76cc4dc8ad Mon Sep 17 00:00:00 2001 From: Liam Morley Date: Wed, 1 Dec 2021 11:44:07 -0500 Subject: [PATCH] Show icon/explanation in measure accordion when a section has insufficient data --- .../stylesheets/bootstrap-overrides.scss | 4 + app/controllers/dashboard_controller.rb | 2 +- app/models/survey_item_response.rb | 41 ++-- app/presenters/admin_data_presenter.rb | 2 +- app/presenters/data_item_presenter.rb | 7 +- app/presenters/measure_presenter.rb | 11 +- app/presenters/student_survey_presenter.rb | 4 +- app/presenters/teacher_survey_presenter.rb | 4 +- .../categories/_data_item_section.html.erb | 8 + spec/models/survey_item_response_spec.rb | 219 ++++++++---------- spec/presenters/measure_presenter_spec.rb | 22 +- 11 files changed, 171 insertions(+), 153 deletions(-) diff --git a/app/assets/stylesheets/bootstrap-overrides.scss b/app/assets/stylesheets/bootstrap-overrides.scss index 8f795a7c..31b84d37 100644 --- a/app/assets/stylesheets/bootstrap-overrides.scss +++ b/app/assets/stylesheets/bootstrap-overrides.scss @@ -21,6 +21,10 @@ $spacers: ( $font-family-base: 'Cabin', sans-serif; $body-color: $black; +$alert-border-radius: 0.5rem; +$alert-color-scale: 0%; +$alert-border-width: 0; + $headings-font-family: 'Bitter', serif; $headings-font-weight: 700; diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index d4f1fc35..6ec688d5 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -8,7 +8,7 @@ class DashboardController < SqmApplicationController private def presenter_for_measure(measure) - score = SurveyItemResponse.score_for_measure(measure: measure, school: @school, academic_year: @academic_year) + score = SurveyItemResponse.score_for_measure(measure: measure, school: @school, academic_year: @academic_year).average VarianceChartRowPresenter.new(measure: measure, score: score) end diff --git a/app/models/survey_item_response.rb b/app/models/survey_item_response.rb index 40c5bf9c..62485f6c 100644 --- a/app/models/survey_item_response.rb +++ b/app/models/survey_item_response.rb @@ -14,39 +14,36 @@ class SurveyItemResponse < ActiveRecord::Base .average(:likert_score) end - def self.score_for_measure(measure:, school:, academic_year:) - survey_item_responses = for_measure_meeting_threshold(measure: measure, school: school, academic_year: academic_year) - + Score = Struct.new(:average, :meets_teacher_threshold?, :meets_student_threshold?) - unless survey_item_responses.nil? - survey_item_responses - .where(academic_year: academic_year, school: school) - .average(:likert_score) - end - end - - def self.sufficient_data?(measure:, school:, academic_year:) - meets_teacher_threshold = teacher_sufficient_data?(measure: measure, school: school, academic_year: academic_year) - meets_student_threshold = student_sufficient_data?(measure: measure, school: school, academic_year: academic_year) - meets_teacher_threshold || meets_student_threshold - end - - private - - def self.for_measure_meeting_threshold(measure:, school:, academic_year:) + def self.score_for_measure(measure:, school:, academic_year:) meets_teacher_threshold = teacher_sufficient_data? measure: measure, school: school, academic_year: academic_year meets_student_threshold = student_sufficient_data? measure: measure, school: school, academic_year: academic_year meets_all_thresholds = meets_teacher_threshold && meets_student_threshold - if meets_all_thresholds + survey_item_responses = if meets_all_thresholds SurveyItemResponse.for_measure(measure) elsif meets_teacher_threshold SurveyItemResponse.teacher_responses_for_measure(measure) elsif meets_student_threshold SurveyItemResponse.student_responses_for_measure(measure) end + + unless survey_item_responses.nil? + score_for_measure = survey_item_responses.average(:likert_score) + end + + Score.new(score_for_measure, meets_teacher_threshold, meets_student_threshold) + end + + def self.sufficient_data?(measure:, school:, academic_year:) + meets_teacher_threshold = teacher_sufficient_data? measure: measure, school: school, academic_year: academic_year + meets_student_threshold = student_sufficient_data? measure: measure, school: school, academic_year: academic_year + meets_teacher_threshold || meets_student_threshold end + private + scope :for_measure, ->(measure) { joins(:survey_item).where('survey_items.measure_id': measure.id) } scope :for_measures, ->(measures) { joins(:survey_item).where('survey_items.measure_id': measures.map(&:id)) } scope :teacher_responses_for_measure, ->(measure) { for_measure(measure).where("survey_items.survey_item_id LIKE 't-%'") } @@ -60,7 +57,7 @@ class SurveyItemResponse < ActiveRecord::Base meets_student_threshold = average_number_of_survey_item_responses >= STUDENT_RESPONSE_THRESHOLD end - meets_student_threshold + !!meets_student_threshold end def self.teacher_sufficient_data?(measure:, school:, academic_year:) @@ -70,6 +67,6 @@ class SurveyItemResponse < ActiveRecord::Base meets_teacher_threshold = average_number_of_survey_item_responses >= TEACHER_RESPONSE_THRESHOLD end - meets_teacher_threshold + !!meets_teacher_threshold end end diff --git a/app/presenters/admin_data_presenter.rb b/app/presenters/admin_data_presenter.rb index a0e20352..406d68b1 100644 --- a/app/presenters/admin_data_presenter.rb +++ b/app/presenters/admin_data_presenter.rb @@ -1,6 +1,6 @@ class AdminDataPresenter < DataItemPresenter def initialize(measure_id:, admin_data_items:) - super(measure_id: measure_id) + super(measure_id: measure_id, has_sufficient_data: true) @admin_data_items = admin_data_items end diff --git a/app/presenters/data_item_presenter.rb b/app/presenters/data_item_presenter.rb index ecedd35f..0c1867f9 100644 --- a/app/presenters/data_item_presenter.rb +++ b/app/presenters/data_item_presenter.rb @@ -1,9 +1,14 @@ class DataItemPresenter - def initialize(measure_id:) + def initialize(measure_id:, has_sufficient_data:) @measure_id = measure_id + @has_sufficient_data = has_sufficient_data end def data_item_accordion_id "data-item-accordion-#{@measure_id}" end + + def sufficient_data? + @has_sufficient_data + end end diff --git a/app/presenters/measure_presenter.rb b/app/presenters/measure_presenter.rb index 415dfb0e..241b5ad9 100644 --- a/app/presenters/measure_presenter.rb +++ b/app/presenters/measure_presenter.rb @@ -14,8 +14,7 @@ class MeasurePresenter end def gauge_presenter - average_score = SurveyItemResponse.score_for_measure(measure: @measure, academic_year: @academic_year, school: @school) - GaugePresenter.new(scale: scale, score: average_score) + GaugePresenter.new(scale: scale, score: score_for_measure.average) end def data_item_accordion_id @@ -24,14 +23,18 @@ class MeasurePresenter def data_item_presenters Array.new.tap do |array| - array << StudentSurveyPresenter.new(measure_id: @measure.measure_id, survey_items: @measure.student_survey_items) if @measure.student_survey_items.any? - array << TeacherSurveyPresenter.new(measure_id: @measure.measure_id, survey_items: @measure.teacher_survey_items) if @measure.teacher_survey_items.any? + array << StudentSurveyPresenter.new(measure_id: @measure.measure_id, survey_items: @measure.student_survey_items, has_sufficient_data: score_for_measure.meets_student_threshold?) if @measure.student_survey_items.any? + array << TeacherSurveyPresenter.new(measure_id: @measure.measure_id, survey_items: @measure.teacher_survey_items, has_sufficient_data: score_for_measure.meets_teacher_threshold?) if @measure.teacher_survey_items.any? array << AdminDataPresenter.new(measure_id: @measure.measure_id, admin_data_items: @measure.admin_data_items) if @measure.admin_data_items.any? end end private + def score_for_measure + @score ||= SurveyItemResponse.score_for_measure(measure: @measure, academic_year: @academic_year, school: @school) + end + def scale Scale.new( watch_low_benchmark: @measure.watch_low_benchmark, diff --git a/app/presenters/student_survey_presenter.rb b/app/presenters/student_survey_presenter.rb index 919df13c..01a3ddc0 100644 --- a/app/presenters/student_survey_presenter.rb +++ b/app/presenters/student_survey_presenter.rb @@ -1,6 +1,6 @@ class StudentSurveyPresenter < DataItemPresenter - def initialize(measure_id:, survey_items:) - super(measure_id: measure_id) + def initialize(measure_id:, survey_items:, has_sufficient_data:) + super(measure_id: measure_id, has_sufficient_data: has_sufficient_data) @survey_items = survey_items end diff --git a/app/presenters/teacher_survey_presenter.rb b/app/presenters/teacher_survey_presenter.rb index fbf55148..1fad9806 100644 --- a/app/presenters/teacher_survey_presenter.rb +++ b/app/presenters/teacher_survey_presenter.rb @@ -1,6 +1,6 @@ class TeacherSurveyPresenter < DataItemPresenter - def initialize(measure_id:, survey_items:) - super(measure_id: measure_id) + def initialize(measure_id:, survey_items:, has_sufficient_data:) + super(measure_id: measure_id, has_sufficient_data: has_sufficient_data) @survey_items = survey_items end diff --git a/app/views/categories/_data_item_section.html.erb b/app/views/categories/_data_item_section.html.erb index 48b917fe..0aa1bd58 100644 --- a/app/views/categories/_data_item_section.html.erb +++ b/app/views/categories/_data_item_section.html.erb @@ -8,6 +8,9 @@ aria-controls="<%= data_item_section.id %>" > <%= data_item_section.title %> + <% unless data_item_section.sufficient_data? %> +   + <% end %> @@ -18,6 +21,11 @@ data-bs-parent="#<%= data_item_section.data_item_accordion_id %>" >
+ <% unless data_item_section.sufficient_data? %> + + <% end %>