feat: add popover to analyze graphs that displays the n-size of the different columns. Make sure to only calculate a score for a race if there are more than 10 respondents to a question.

pull/2/head
rebuilt 2 years ago committed by Nelson Jovel
parent cec48e55d3
commit 67e469a66c

@ -5,11 +5,11 @@ module Analyze
class AllData
include Analyze::Graph::Column
def to_s
'All Data'
"All Data"
end
def slug
'all-data'
"all-data"
end
def columns

@ -5,11 +5,11 @@ module Analyze
module Column
class AllAdmin < GroupedBarColumnPresenter
def label
'All Admin'
"All Admin"
end
def basis
'admin data'
"admin data"
end
def show_irrelevancy_message?
@ -23,12 +23,16 @@ module Analyze
end
def insufficiency_message
['data not', 'available']
["data not", "available"]
end
def score(year_index)
measure.admin_score(school:, academic_year: academic_years[year_index])
end
def type
:admin
end
end
end
end

@ -5,7 +5,7 @@ module Analyze
module Column
class AllStudent < GroupedBarColumnPresenter
def label
'All Students'
"All Students"
end
def show_irrelevancy_message?
@ -23,6 +23,10 @@ module Analyze
def score(year_index)
measure.student_score(school:, academic_year: academic_years[year_index])
end
def type
:student
end
end
end
end

@ -5,7 +5,7 @@ module Analyze
module Column
class AllSurveyData < GroupedBarColumnPresenter
def label
'Survey Data'
"Survey Data"
end
def show_irrelevancy_message?
@ -24,6 +24,10 @@ module Analyze
combined_score(school:, academic_year: academic_years[year_index])
end
def type
:all_survey_data
end
private
def combined_score(school:, academic_year:)

@ -5,11 +5,11 @@ module Analyze
module Column
class AllTeacher < GroupedBarColumnPresenter
def label
'All Teachers'
"All Teachers"
end
def basis
'teacher surveys'
"teacher surveys"
end
def show_irrelevancy_message?
@ -27,6 +27,15 @@ module Analyze
def score(year_index)
measure.teacher_score(school:, academic_year: academic_years[year_index])
end
def type
:teacher
end
def n_size(year_index)
SurveyItemResponse.where(survey_item: measure.teacher_survey_items, school:,
academic_year: academic_years[year_index]).count
end
end
end
end

@ -6,12 +6,13 @@ module Analyze
module GenderColumn
class Female < GroupedBarColumnPresenter
include Analyze::Graph::Column::GenderColumn::ScoreForGender
include Analyze::Graph::Column::GenderColumn::GenderCount
def label
'Female'
"Female"
end
def basis
'student'
"student"
end
def show_irrelevancy_message?

@ -0,0 +1,18 @@
module Analyze
module Graph
module Column
module GenderColumn
module GenderCount
def type
:student
end
def n_size(year_index)
SurveyItemResponse.where(gender:, survey_item: measure.student_survey_items, school:, grade: grades(year_index),
academic_year: academic_years[year_index]).select(:response_id).distinct.count
end
end
end
end
end
end

@ -6,12 +6,13 @@ module Analyze
module GenderColumn
class Male < GroupedBarColumnPresenter
include Analyze::Graph::Column::GenderColumn::ScoreForGender
include Analyze::Graph::Column::GenderColumn::GenderCount
def label
'Male'
"Male"
end
def basis
'student'
"student"
end
def show_irrelevancy_message?

@ -6,12 +6,13 @@ module Analyze
module GenderColumn
class NonBinary < GroupedBarColumnPresenter
include Analyze::Graph::Column::GenderColumn::ScoreForGender
include Analyze::Graph::Column::GenderColumn::GenderCount
def label
'Non-Binary'
"Non-Binary"
end
def basis
'student'
"student"
end
def show_irrelevancy_message?

@ -6,12 +6,13 @@ module Analyze
module GenderColumn
class Unknown < GroupedBarColumnPresenter
include Analyze::Graph::Column::GenderColumn::ScoreForGender
include Analyze::Graph::Column::GenderColumn::GenderCount
def label
'Unknown'
"Unknown"
end
def basis
'student'
"student"
end
def show_irrelevancy_message?

@ -6,12 +6,13 @@ module Analyze
module Grade
class Eight < GroupedBarColumnPresenter
include Analyze::Graph::Column::Grade::ScoreForGrade
include Analyze::Graph::Column::Grade::GradeCount
def label
'Grade 8'
"Grade 8"
end
def basis
'student'
"student"
end
def show_irrelevancy_message?
@ -30,4 +31,3 @@ module Analyze
end
end
end

@ -6,12 +6,13 @@ module Analyze
module Grade
class Eleven < GroupedBarColumnPresenter
include Analyze::Graph::Column::Grade::ScoreForGrade
include Analyze::Graph::Column::Grade::GradeCount
def label
'Grade 11'
"Grade 11"
end
def basis
'student'
"student"
end
def show_irrelevancy_message?
@ -30,4 +31,3 @@ module Analyze
end
end
end

@ -6,12 +6,13 @@ module Analyze
module Grade
class Five < GroupedBarColumnPresenter
include Analyze::Graph::Column::Grade::ScoreForGrade
include Analyze::Graph::Column::Grade::GradeCount
def label
'Grade 5'
"Grade 5"
end
def basis
'student'
"student"
end
def show_irrelevancy_message?

@ -6,12 +6,13 @@ module Analyze
module Grade
class Four < GroupedBarColumnPresenter
include Analyze::Graph::Column::Grade::ScoreForGrade
include Analyze::Graph::Column::Grade::GradeCount
def label
'Grade 4'
"Grade 4"
end
def basis
'student'
"student"
end
def show_irrelevancy_message?

@ -0,0 +1,18 @@
module Analyze
module Graph
module Column
module Grade
module GradeCount
def type
:student
end
def n_size(year_index)
SurveyItemResponse.where(grade:, survey_item: measure.student_survey_items, school:,
academic_year: academic_years[year_index]).select(:response_id).distinct.count
end
end
end
end
end
end

@ -6,12 +6,13 @@ module Analyze
module Grade
class Nine < GroupedBarColumnPresenter
include Analyze::Graph::Column::Grade::ScoreForGrade
include Analyze::Graph::Column::Grade::GradeCount
def label
'Grade 9'
"Grade 9"
end
def basis
'student'
"student"
end
def show_irrelevancy_message?
@ -30,5 +31,3 @@ module Analyze
end
end
end

@ -6,12 +6,13 @@ module Analyze
module Grade
class One < GroupedBarColumnPresenter
include Analyze::Graph::Column::Grade::ScoreForGrade
include Analyze::Graph::Column::Grade::GradeCount
def label
'Grade 1'
"Grade 1"
end
def basis
'student'
"student"
end
def show_irrelevancy_message?

@ -6,12 +6,13 @@ module Analyze
module Grade
class Seven < GroupedBarColumnPresenter
include Analyze::Graph::Column::Grade::ScoreForGrade
include Analyze::Graph::Column::Grade::GradeCount
def label
'Grade 7'
"Grade 7"
end
def basis
'student'
"student"
end
def show_irrelevancy_message?

@ -6,12 +6,13 @@ module Analyze
module Grade
class Six < GroupedBarColumnPresenter
include Analyze::Graph::Column::Grade::ScoreForGrade
include Analyze::Graph::Column::Grade::GradeCount
def label
'Grade 6'
"Grade 6"
end
def basis
'student'
"student"
end
def show_irrelevancy_message?

@ -6,12 +6,13 @@ module Analyze
module Grade
class Ten < GroupedBarColumnPresenter
include Analyze::Graph::Column::Grade::ScoreForGrade
include Analyze::Graph::Column::Grade::GradeCount
def label
'Grade 10'
"Grade 10"
end
def basis
'student'
"student"
end
def show_irrelevancy_message?
@ -30,5 +31,3 @@ module Analyze
end
end
end

@ -6,12 +6,13 @@ module Analyze
module Grade
class Three < GroupedBarColumnPresenter
include Analyze::Graph::Column::Grade::ScoreForGrade
include Analyze::Graph::Column::Grade::GradeCount
def label
'Grade 3'
"Grade 3"
end
def basis
'student'
"student"
end
def show_irrelevancy_message?

@ -6,12 +6,13 @@ module Analyze
module Grade
class Twelve < GroupedBarColumnPresenter
include Analyze::Graph::Column::Grade::ScoreForGrade
include Analyze::Graph::Column::Grade::GradeCount
def label
'Grade 12'
"Grade 12"
end
def basis
'student'
"student"
end
def show_irrelevancy_message?
@ -30,5 +31,3 @@ module Analyze
end
end
end

@ -8,12 +8,13 @@ module Analyze
attr_reader :sufficient_responses
include Analyze::Graph::Column::Grade::ScoreForGrade
include Analyze::Graph::Column::Grade::GradeCount
def label
'Grade 2'
"Grade 2"
end
def basis
'student'
"student"
end
def show_irrelevancy_message?

@ -6,12 +6,13 @@ module Analyze
module Grade
class Zero < GroupedBarColumnPresenter
include Analyze::Graph::Column::Grade::ScoreForGrade
include Analyze::Graph::Column::Grade::GradeCount
def label
'Kindergarten'
"Kindergarten"
end
def basis
'student'
"student"
end
def show_irrelevancy_message?

@ -105,11 +105,27 @@ module Analyze
"student surveys"
end
def type
:all_data
end
def show_popover?
%i[student teacher].include? type
end
def n_size(year_index)
SurveyItemResponse.where(survey_item: measure.student_survey_items, school:, grade: grades(year_index),
academic_year: academic_years[year_index]).select(:response_id).distinct.count
end
def popover_content(year_index)
"#{n_size(year_index)} #{type.to_s.capitalize}s"
end
def insufficiency_message
["survey response", "rate below 25%"]
end
# TODO: figure out why this doesn't work
def sufficient_data?(year_index)
case basis
when "student"
@ -121,6 +137,10 @@ module Analyze
end
end
def grades(year_index)
Respondent.find_by(school:, academic_year: academic_years[year_index]).counts_by_grade.keys
end
private
YearlyScore = Struct.new(:year, :score)

@ -6,6 +6,7 @@ module Analyze
module IncomeColumn
class Disadvantaged < GroupedBarColumnPresenter
include Analyze::Graph::Column::IncomeColumn::ScoreForIncome
include Analyze::Graph::Column::IncomeColumn::IncomeCount
def label
"Economically Disadvantaged"
end

@ -0,0 +1,18 @@
module Analyze
module Graph
module Column
module IncomeColumn
module IncomeCount
def type
:student
end
def n_size(year_index)
SurveyItemResponse.where(income:, survey_item: measure.student_survey_items, school:, grade: grades(year_index),
academic_year: academic_years[year_index]).select(:response_id).distinct.count
end
end
end
end
end
end

@ -6,6 +6,7 @@ module Analyze
module IncomeColumn
class NotDisadvantaged < GroupedBarColumnPresenter
include Analyze::Graph::Column::IncomeColumn::ScoreForIncome
include Analyze::Graph::Column::IncomeColumn::IncomeCount
def label
"Not Disadvantaged"
end

@ -6,6 +6,7 @@ module Analyze
module IncomeColumn
class Unknown < GroupedBarColumnPresenter
include Analyze::Graph::Column::IncomeColumn::ScoreForIncome
include Analyze::Graph::Column::IncomeColumn::IncomeCount
def label
"Unknown"
end

@ -6,8 +6,9 @@ module Analyze
module RaceColumn
class AmericanIndian < GroupedBarColumnPresenter
include Analyze::Graph::Column::ScoreForRace
include Analyze::Graph::Column::RaceColumn::RaceCount
def label
'American Indian'
"American Indian"
end
def show_irrelevancy_message?

@ -6,8 +6,9 @@ module Analyze
module RaceColumn
class Asian < GroupedBarColumnPresenter
include Analyze::Graph::Column::ScoreForRace
include Analyze::Graph::Column::RaceColumn::RaceCount
def label
'Asian'
"Asian"
end
def show_irrelevancy_message?

@ -6,8 +6,9 @@ module Analyze
module RaceColumn
class Black < GroupedBarColumnPresenter
include Analyze::Graph::Column::ScoreForRace
include Analyze::Graph::Column::RaceColumn::RaceCount
def label
'Black'
"Black"
end
def show_irrelevancy_message?

@ -6,8 +6,9 @@ module Analyze
module RaceColumn
class Hispanic < GroupedBarColumnPresenter
include Analyze::Graph::Column::ScoreForRace
include Analyze::Graph::Column::RaceColumn::RaceCount
def label
'Hispanic'
"Hispanic"
end
def show_irrelevancy_message?

@ -6,9 +6,10 @@ module Analyze
module RaceColumn
class MiddleEastern < GroupedBarColumnPresenter
include Analyze::Graph::Column::ScoreForRace
include Analyze::Graph::Column::RaceColumn::RaceCount
def label
'Middle Eastern'
"Middle Eastern"
end
def show_irrelevancy_message?

@ -6,8 +6,9 @@ module Analyze
module RaceColumn
class Multiracial < GroupedBarColumnPresenter
include Analyze::Graph::Column::ScoreForRace
include Analyze::Graph::Column::RaceColumn::RaceCount
def label
'Multiracial'
"Multiracial"
end
def show_irrelevancy_message?

@ -0,0 +1,20 @@
module Analyze
module Graph
module Column
module RaceColumn
module RaceCount
def type
:student
end
def n_size(year_index)
SurveyItemResponse.joins("JOIN student_races on survey_item_responses.student_id = student_races.student_id JOIN students on students.id = student_races.student_id").where(
school:, academic_year: academic_years[year_index],
survey_item: measure.student_survey_items
).where("student_races.race_id": race.id).select(:response_id).distinct.count
end
end
end
end
end
end

@ -6,8 +6,9 @@ module Analyze
module RaceColumn
class Unknown < GroupedBarColumnPresenter
include Analyze::Graph::Column::ScoreForRace
include Analyze::Graph::Column::RaceColumn::RaceCount
def label
'Not Listed'
"Not Listed"
end
def show_irrelevancy_message?

@ -6,8 +6,9 @@ module Analyze
module RaceColumn
class White < GroupedBarColumnPresenter
include Analyze::Graph::Column::ScoreForRace
include Analyze::Graph::Column::RaceColumn::RaceCount
def label
'White'
"White"
end
def show_irrelevancy_message?

@ -60,9 +60,9 @@ class RaceScoreLoader
def self.grouped_responses(school:, academic_year:, survey_items:, race:)
@grouped_responses ||= Hash.new do |memo, (school, academic_year, survey_items, race)|
memo[[school, academic_year, survey_items, race]] =
SurveyItemResponse.joins('JOIN student_races on survey_item_responses.student_id = student_races.student_id JOIN students on students.id = student_races.student_id').where(
SurveyItemResponse.joins("JOIN student_races on survey_item_responses.student_id = student_races.student_id JOIN students on students.id = student_races.student_id").where(
school:, academic_year:
).where("student_races.race_id": race.id).group(:survey_item_id).average(:likert_score)
).where("student_races.race_id": race.id).group(:survey_item_id).having("count(*) >= 10").average(:likert_score)
end
@grouped_responses[[school, academic_year, survey_items, race]]
@ -88,7 +88,7 @@ class RaceScoreLoader
def self.sufficient_responses(school:, academic_year:, race:)
@sufficient_responses ||= Hash.new do |memo, (school, academic_year, race)|
number_of_students_for_a_racial_group = SurveyItemResponse.joins('JOIN student_races on survey_item_responses.student_id = student_races.student_id JOIN students on students.id = student_races.student_id').where(
number_of_students_for_a_racial_group = SurveyItemResponse.joins("JOIN student_races on survey_item_responses.student_id = student_races.student_id JOIN students on students.id = student_races.student_id").where(
school:, academic_year:
).where("student_races.race_id": race.id).distinct.pluck(:student_id).count
memo[[school, academic_year, race]] = number_of_students_for_a_racial_group >= 10

@ -2,13 +2,25 @@
<% score_label_y = [5, 10, 15, 5, 10, 15 ] %>
<% column.bars.each_with_index do |bar, index| %>
<% if column.sufficient_data?(index) %>
<rect data-for-academic-year="<%= bar.academic_year.range %>" x="<%= bar.x_position %>%" y="<%= bar.y_offset %>%" width="<%= column.bar_width %>%" height="<%= bar.bar_height_percentage %>%" fill="<%= bar.color %>" />
<rect
<% if column.show_popover? %>
data-bs-toggle="popover"
data-bs-placement="right"
data-bs-content="<%= column.popover_content(index) %>"
<% end %>
data-for-academic-year="<%= bar.academic_year.range %>"
x="<%= bar.x_position %>%"
y="<%= bar.y_offset %>%"
width="<%= column.bar_width %>%"
height="<%= bar.bar_height_percentage %>%"
fill="<%= bar.color %>" />
<% if ENV["SCORES"].present? && ENV["SCORES"].upcase == "SHOW" %>
<text x="<%= bar.x_position + (column.bar_width * 0.5) %>%" y="<%= score_label_y[index] %>%" text-anchor="middle" dominant-baseline="middle">
<%= bar.average %>
</text>
<% end %>
<% end %>
<% end %>

@ -0,0 +1,15 @@
describe('navigates the analyze page', () => {
it('it displays counts of students and teacher in the hovers', () => {
login("/districts/lee-public-schools/schools/lee-elementary-school/analyze?year=2022-23&academic_years=2022-23", "bGVlOmxlZSE=")
})
})
function login(path, credentials) {
cy.visit(path, {
headers: {
authorization: `Basic ${credentials}`
},
failOnStatusCode: false
})
}
Loading…
Cancel
Save