From 72c90b8f47667270755a9acc8093b6f9874912c1 Mon Sep 17 00:00:00 2001 From: rebuilt Date: Wed, 16 Nov 2022 21:10:13 -0800 Subject: [PATCH] Add selector for all data --- app/controllers/analyze_controller.rb | 31 +++-- .../controllers/analyze_controller.js | 93 ++++++++++---- app/models/measure.rb | 10 ++ app/presenters/analyze/graph/all_data.rb | 20 +++ .../analyze/graph/column/all_admin.rb | 34 +++++ .../analyze/graph/column/all_survey_data.rb | 47 +++++++ .../analyze/graph/students_and_teachers.rb | 2 +- app/presenters/analyze/slice/all_data.rb | 17 +++ app/presenters/analyze/source/all_data.rb | 21 ++++ app/presenters/analyze/source/survey_data.rb | 13 +- app/presenters/analyze/ui.rb | 8 ++ app/views/analyze/_data_filters.html.erb | 117 ++++++------------ app/views/analyze/_group_selectors.html.erb | 67 ++++++++++ spec/views/analyze/index.html.erb_spec.rb | 1 + 14 files changed, 363 insertions(+), 118 deletions(-) create mode 100644 app/presenters/analyze/graph/all_data.rb create mode 100644 app/presenters/analyze/graph/column/all_admin.rb create mode 100644 app/presenters/analyze/graph/column/all_survey_data.rb create mode 100644 app/presenters/analyze/slice/all_data.rb create mode 100644 app/presenters/analyze/source/all_data.rb create mode 100644 app/presenters/analyze/ui.rb create mode 100644 app/views/analyze/_group_selectors.html.erb diff --git a/app/controllers/analyze_controller.rb b/app/controllers/analyze_controller.rb index e45c8748..a0a85625 100644 --- a/app/controllers/analyze_controller.rb +++ b/app/controllers/analyze_controller.rb @@ -3,7 +3,7 @@ class AnalyzeController < SqmApplicationController before_action :assign_categories, :assign_subcategories, :assign_measures, :assign_academic_years, :response_rate_timestamp, :races, :selected_races, :graph, :graphs, :background, :race_score_timestamp, - :sources, :group, :groups, :selected_grades, :grades, :slice, :selected_genders, :genders, only: [:index] + :source, :sources, :group, :groups, :selected_grades, :grades, :slice, :selected_genders, :genders, only: [:index] def index; end private @@ -75,8 +75,8 @@ class AnalyzeController < SqmApplicationController end def graphs - @graphs ||= [Analyze::Graph::StudentsAndTeachers.new, Analyze::Graph::StudentsByRace.new(races: selected_races), - Analyze::Graph::StudentsByGrade.new(grades: selected_grades), Analyze::Graph::StudentsByGender.new(genders: selected_genders)] + @graphs ||= [Analyze::Graph::AllData.new, Analyze::Graph::StudentsAndTeachers.new, Analyze::Graph::StudentsByRace.new(races: selected_races), + Analyze::Graph::StudentsByGrade.new(grades: selected_grades), Analyze::Graph::StudentsByGender.new(genders: selected_genders)] end def background @@ -91,8 +91,25 @@ class AnalyzeController < SqmApplicationController end end + def source + source_param = params[:source] + sources.each do |source| + @source = source if source.slug == source_param + end + + @source ||= sources.first + end + def sources - @sources = [Analyze::Source::SurveyData.new(slices:)] + all_data_slices = [Analyze::Slice::AllData.new] + all_data_source = Analyze::Source::AllData.new(slices: all_data_slices) + + students_and_teachers = Analyze::Slice::StudentsAndTeachers.new + students_by_group = Analyze::Slice::StudentsByGroup.new(races:, grades:) + survey_data_slices = [students_and_teachers, students_by_group] + survey_data_source = Analyze::Source::SurveyData.new(slices: survey_data_slices) + + @sources = [all_data_source, survey_data_source] end def slice @@ -105,9 +122,7 @@ class AnalyzeController < SqmApplicationController end def slices - students_and_teachers = Analyze::Slice::StudentsAndTeachers.new - students_by_group = Analyze::Slice::StudentsByGroup.new(races:, grades:) - [students_and_teachers, students_by_group] + source.slices end def group @@ -156,7 +171,7 @@ class AnalyzeController < SqmApplicationController gender_list = gender_params.split(',') if gender_params if gender_list gender_list = gender_list.map do |gender| - Gender.find_by_designation(gender) + Gender.find_by_designation(gender) end end gender_list diff --git a/app/javascript/controllers/analyze_controller.js b/app/javascript/controllers/analyze_controller.js index dad9712e..ed11416a 100644 --- a/app/javascript/controllers/analyze_controller.js +++ b/app/javascript/controllers/analyze_controller.js @@ -5,17 +5,22 @@ export default class extends Controller { connect() { } refresh(event) { let base_url = event.target.value; + let target = event.target; + console.log(this.selected_slice(target)) + console.log(target.name) let url = base_url + "&academic_years=" + this.selected_years().join(",") + + "&source=" + + this.selected_source(target) + + "&slice=" + + this.selected_slice(target) + "&group=" + this.selected_group() + - "&slice=" + - this.selected_slice() + "&graph=" + - this.selected_graph() + + this.selected_graph(target) + "&races=" + this.selected_races().join(",") + "&genders=" + @@ -57,37 +62,79 @@ export default class extends Controller { return selected_group[0]; } - selected_slice() { - let slices = [...document.getElementsByName("slice")]; - let selected_slice = slices - .filter((item) => { - return item.checked; - }) - .map((item) => { - return item.id; - }); + selected_source(target) { + if (target.name === 'source') { + return target.id; + } + if (target.name === 'slice' || target.name === 'group') { + return 'survey-data-only'; + } - return selected_slice[0]; + return window.source; } - selected_graph() { + selected_slice(target) { + if (target.name === 'source' && target.id === 'all-data') { + return 'all-data'; + } + if (target.name === 'source' && target.id === 'survey-data-only') { + return 'students-and-teachers'; + } + + if (target.name === 'group') { + return 'students-by-group'; + } + + if (target.name === 'source' || target.name === 'slice') { + let slices = [...document.getElementsByName("slice")]; + let selected_slice = slices + .filter((item) => { + return item.id != "all-data"; + }) + .filter((item) => { + return item.checked; + }) + .map((item) => { + return item.id; + }); + + return selected_slice[0]; + } + + return window.slice; + } + + selected_graph(target) { + if (target.name === 'source' && target.id === 'all-data') { + return 'all-data' + } + if (target.name === 'source' && target.id === 'survey-data-only') { + return 'students-and-teachers' + } + let graphs = [...document.getElementsByName("slice")]; - let selected_graph = graphs + let selected_slice = graphs .filter((item) => { return item.checked; }) .map((item) => { return item.id; })[0]; - if (selected_graph === 'students-and-teachers') { - return selected_graph; - } else if (this.selected_group() === 'race') { - return 'students-by-race' - } else if (this.selected_group() === 'gender'){ - return 'students-by-gender' - } else { - return 'students-by-grade' + + if (target.name === 'slice' || target.name === 'group') { + if (selected_slice === 'students-and-teachers') { + return 'students-and-teachers'; + } else if (this.selected_group() === 'race') { + return 'students-by-race'; + } else if (this.selected_group() === 'gender') { + return 'students-by-gender'; + } else if (this.selected_group() === 'grade') { + return 'students-by-grade'; + } } + + return window.graph; + } selected_races() { diff --git a/app/models/measure.rb b/app/models/measure.rb index 419be2fa..0a3b0480 100644 --- a/app/models/measure.rb +++ b/app/models/measure.rb @@ -96,6 +96,16 @@ class Measure < ActiveRecord::Base @teacher_score[[school, academic_year]] end + def admin_score(school:, academic_year:) + @admin_score ||= Hash.new do |memo, (school, academic_year)| + meets_admin_threshold = sufficient_admin_data?(school:, academic_year:) + average = admin_data_averages(school:, academic_year:).average if meets_admin_threshold + memo[[school, academic_year]] = scorify(average:, school:, academic_year:) + end + + @admin_score[[school, academic_year]] + end + def warning_low_benchmark 1 end diff --git a/app/presenters/analyze/graph/all_data.rb b/app/presenters/analyze/graph/all_data.rb new file mode 100644 index 00000000..04266a1a --- /dev/null +++ b/app/presenters/analyze/graph/all_data.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module Analyze + module Graph + class AllData + include Analyze::Graph::Column + def to_s + 'All Data' + end + + def slug + 'all-data' + end + + def columns + [AllStudent, AllTeacher, AllAdmin, GroupedBarColumnPresenter] + end + end + end +end diff --git a/app/presenters/analyze/graph/column/all_admin.rb b/app/presenters/analyze/graph/column/all_admin.rb new file mode 100644 index 00000000..16a80c39 --- /dev/null +++ b/app/presenters/analyze/graph/column/all_admin.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +module Analyze + module Graph + module Column + class AllAdmin < GroupedBarColumnPresenter + def label + 'All Admin' + end + + def basis + 'student' + end + + def show_irrelevancy_message? + # !measure.includes_admin_data_items? + false + end + + def show_insufficient_data_message? + # academic_years.any? do |year| + # measure.sufficient_admin_data?(school:, academic_year: year) + # end + false + end + + def score(year_index) + measure.admin_score(school:, academic_year: academic_years[year_index]) + # Score.new(average: 3) + end + end + end + end +end diff --git a/app/presenters/analyze/graph/column/all_survey_data.rb b/app/presenters/analyze/graph/column/all_survey_data.rb new file mode 100644 index 00000000..6d79d881 --- /dev/null +++ b/app/presenters/analyze/graph/column/all_survey_data.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +module Analyze + module Graph + module Column + class AllSurveyData < GroupedBarColumnPresenter + def label + 'Survey Data' + end + + def basis + 'student' + end + + def show_irrelevancy_message? + false + end + + def show_insufficient_data_message? + scores = academic_years.map do |year| + combined_score(school:, academic_year: year) + end + + scores.all? { |score| !score.meets_student_threshold? && !score.meets_teacher_threshold? } + end + + def score(year_index) + combined_score(school:, academic_year: academic_years[year_index]) + end + + private + + def combined_score(school:, academic_year:) + teacher_score = measure.teacher_score(school:, academic_year:) + student_score = measure.student_score(school:, academic_year:) + + averages = [] + averages << student_score.average unless student_score.average.nil? + averages << teacher_score.average unless teacher_score.average.nil? + average = averages.average if averages.length > 0 + combined_score = Score.new(average:, meets_student_threshold: student_score.meets_student_threshold, + meets_teacher_threshold: teacher_score.meets_teacher_threshold) + end + end + end + end +end diff --git a/app/presenters/analyze/graph/students_and_teachers.rb b/app/presenters/analyze/graph/students_and_teachers.rb index dc6f394d..482f817e 100644 --- a/app/presenters/analyze/graph/students_and_teachers.rb +++ b/app/presenters/analyze/graph/students_and_teachers.rb @@ -13,7 +13,7 @@ module Analyze end def columns - [AllStudent, AllTeacher, GroupedBarColumnPresenter] + [AllStudent, AllTeacher, AllSurveyData] end end end diff --git a/app/presenters/analyze/slice/all_data.rb b/app/presenters/analyze/slice/all_data.rb new file mode 100644 index 00000000..10137a78 --- /dev/null +++ b/app/presenters/analyze/slice/all_data.rb @@ -0,0 +1,17 @@ +module Analyze + module Slice + class AllData + def to_s + 'All Data' + end + + def slug + 'all-data' + end + + def graphs + [Analyze::Graph::AllData.new] + end + end + end +end diff --git a/app/presenters/analyze/source/all_data.rb b/app/presenters/analyze/source/all_data.rb new file mode 100644 index 00000000..72889904 --- /dev/null +++ b/app/presenters/analyze/source/all_data.rb @@ -0,0 +1,21 @@ +module Analyze + module Source + class AllData + attr_reader :slices + + include Analyze::Slice + + def initialize(slices:) + @slices = slices + end + + def to_s + 'All Data' + end + + def slug + 'all-data' + end + end + end +end diff --git a/app/presenters/analyze/source/survey_data.rb b/app/presenters/analyze/source/survey_data.rb index 1cef340a..654020b6 100644 --- a/app/presenters/analyze/source/survey_data.rb +++ b/app/presenters/analyze/source/survey_data.rb @@ -8,13 +8,14 @@ module Analyze def initialize(slices:) @slices = slices end - # def to_s - # 'Survey Data Only' - # end - # def value - # 'survey-data-only' - # end + def to_s + 'Survey Data Only' + end + + def slug + 'survey-data-only' + end end end end diff --git a/app/presenters/analyze/ui.rb b/app/presenters/analyze/ui.rb new file mode 100644 index 00000000..cf440140 --- /dev/null +++ b/app/presenters/analyze/ui.rb @@ -0,0 +1,8 @@ +module Analyze + class Ui + attr_reader :params + def initialize(params:) + @params = params + end + end +end diff --git a/app/views/analyze/_data_filters.html.erb b/app/views/analyze/_data_filters.html.erb index f1510033..e7011a36 100644 --- a/app/views/analyze/_data_filters.html.erb +++ b/app/views/analyze/_data_filters.html.erb @@ -1,84 +1,41 @@

Data Filters

- <% @sources.first.slices.each do |slice| %> -
- > - -
- <% end %> - - - -

Select a group

- - <% @races.each do |race| %> -
- - <%= @graph.slug == 'students-and-teachers' ? "disabled" : "" %> - <%= @group.slug == 'race' ? "" : "hidden" %>> - - -
- <% end %> - - <% @grades.each do |grade| %> -
- - <%= @graph.slug == 'students-and-teachers' ? "disabled" : "" %> - <%= @group.slug == 'grade' ? "" : "hidden" %>> - - -
- <% end %> - - <% @genders.each do |gender| %> -
- - <%= @graph.slug == 'students-and-teachers' ? "disabled" : "" %> - <%= @group.slug == 'gender' ? "" : "hidden" %>> - - -
- <% end %> + <% @sources.each do |source| %> + + > + + + <% source.slices.each do | slice | %> +
+ + <%= slice.slug == "all-data" ? "hidden" : "" %>> + + +
+ <% end %> + <% end %> + + <%= render partial: "group_selectors" %>
+ + diff --git a/app/views/analyze/_group_selectors.html.erb b/app/views/analyze/_group_selectors.html.erb new file mode 100644 index 00000000..c82de49e --- /dev/null +++ b/app/views/analyze/_group_selectors.html.erb @@ -0,0 +1,67 @@ + + +

Select a group

+ +<% @races.each do |race| %> +
+ + <%= @graph.slug == 'students-and-teachers' || @source.slug == 'all-data' ? "disabled" : "" %> + <%= @group.slug == 'race' ? "" : "hidden" %>> + + +
+<% end %> + +<% @grades.each do |grade| %> +
+ + <%= @graph.slug == 'students-and-teachers' || @source.slug == 'all-data' ? "disabled" : "" %> + <%= @group.slug == 'grade' ? "" : "hidden" %>> + + +
+<% end %> + +<% @genders.each do |gender| %> +
+ + <%= @graph.slug == 'students-and-teachers' || @source.slug == 'all-data' ? "disabled" : "" %> + <%= @group.slug == 'gender' ? "" : "hidden" %>> + + +
+<% end %> diff --git a/spec/views/analyze/index.html.erb_spec.rb b/spec/views/analyze/index.html.erb_spec.rb index fdb3b95c..d1c277f0 100644 --- a/spec/views/analyze/index.html.erb_spec.rb +++ b/spec/views/analyze/index.html.erb_spec.rb @@ -110,6 +110,7 @@ describe 'analyze/index' do assign :subcategories, category.subcategories assign :measures, [support_for_teaching, effective_leadership, professional_qualifications] assign :sources, sources + assign :source, sources.first assign :groups, groups assign :group, group assign :slice, slice