feat: restore hotwire functionality on analyze page

mciea-main
Nelson Jovel 1 year ago
parent 22b9b44773
commit 8dc503f454

@ -4,5 +4,6 @@ class AnalyzeController < SqmApplicationController
def index def index
@presenter = Analyze::Presenter.new(params:, school: @school, academic_year: @academic_year) @presenter = Analyze::Presenter.new(params:, school: @school, academic_year: @academic_year)
@background ||= BackgroundPresenter.new(num_of_columns: @presenter.graph.columns.count) @background ||= BackgroundPresenter.new(num_of_columns: @presenter.graph.columns.count)
@academic_year = @presenter.selected_academic_years&.first || AcademicYear.last
end end
end end

@ -1,152 +1,25 @@
import { Controller } from "@hotwired/stimulus"; import { Controller } from "@hotwired/stimulus";
import debounce from "debounce";
// Connects to data-controller="analyze" // Connects to data-controller="analyze"
export default class extends Controller { export default class extends Controller {
connect() { } static targets = ["category", "subcategory"]
refresh(event) {
let base_url = event.target.value;
let target = event.target;
console.log(this.selected_slice(target))
console.log(target.name)
let url = initialize() {
base_url + this.submit = debounce(this.submit.bind(this), 300)
"&academic_years=" +
this.selected_years().join(",") +
"&source=" +
this.selected_source(target) +
"&slice=" +
this.selected_slice(target) +
"&group=" +
this.selected_group() +
"&graph=" +
this.selected_graph(target) +
"&races=" +
this.selected_items("race").join(",") +
"&genders=" +
this.selected_items("gender").join(",") +
"&incomes=" +
this.selected_items("income").join(",") +
"&grades=" +
this.selected_items("grade").join(",") +
"&ells=" +
this.selected_items("ell").join(",") +
"&speds=" +
this.selected_items("sped").join(",");
this.go_to(url);
}
go_to(location) {
window.location = location;
}
selected_years() {
let year_checkboxes = [...document.getElementsByName("year-checkbox")];
let years = year_checkboxes
.filter((item) => {
return item.checked;
})
.map((item) => {
return item.id;
});
return years;
} }
selected_group() { connect() {
let groups = [...document.getElementsByName("group-option")]; const collection = document.getElementsByClassName("popover");
let selected_group = groups
.filter((item) => {
return item.selected;
})
.map((item) => {
return item.id;
});
return selected_group[0];
}
selected_source(target) { for (let i = 0; i < collection.length; i++) {
if (target.name === 'source') { collection[i].parentNode.removeChild(collection[i]);
return target.id;
} }
if (target.name === 'slice' || target.name === 'group') {
return 'survey-data-only';
}
return window.source;
}
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_slice = graphs
.filter((item) => {
return item.checked;
})
.map((item) => {
return item.id;
})[0];
if (target.name === 'slice' || target.name === 'group') {
if (selected_slice === 'students-and-teachers') {
return 'students-and-teachers';
}
return `students-by-${this.selected_group()}`;
}
return window.graph;
} }
selected_items(type) { submit() {
let checkboxes = [...document.getElementsByName(`${type}-checkbox`)] console.log("Submitting form");
let items = checkboxes
.filter((item) => {
return item.checked;
})
.map((item) => {
return item.id.replace(`${type}-`, '');
});
return items; this.element.requestSubmit();
} }
} }

@ -3,6 +3,9 @@
require "date" require "date"
class AcademicYear < ActiveRecord::Base class AcademicYear < ActiveRecord::Base
include FriendlyId
friendly_id :range, use: [:slugged]
scope :by_range, -> { all.map { |academic_year| [academic_year.range, academic_year] }.to_h } scope :by_range, -> { all.map { |academic_year| [academic_year.range, academic_year] }.to_h }
scope :of_year, ->(range) { all.select { |ay| ay.range.start_with?(range) } } scope :of_year, ->(range) { all.select { |ay| ay.range.start_with?(range) } }
@ -58,3 +61,4 @@ class AcademicYear < ActiveRecord::Base
end end
AcademicYearRange = Struct.new(:start, :end, :season) AcademicYearRange = Struct.new(:start, :end, :season)

@ -1,4 +1,7 @@
class Gender < ApplicationRecord class Gender < ApplicationRecord
include FriendlyId
friendly_id :designation, use: [:slugged]
scope :by_qualtrics_code, lambda { scope :by_qualtrics_code, lambda {
all.map { |gender| [gender.qualtrics_code, gender] }.to_h all.map { |gender| [gender.qualtrics_code, gender] }.to_h
} }
@ -32,3 +35,4 @@ class Gender < ApplicationRecord
end end
end end
end end

@ -4,6 +4,7 @@ module Analyze
module Graph module Graph
class AllData class AllData
include Analyze::Graph::Column include Analyze::Graph::Column
def to_s def to_s
"All Data" "All Data"
end end
@ -15,6 +16,14 @@ module Analyze
def columns def columns
[AllStudent, AllTeacher, AllAdmin, Analyze::Graph::Column::AllData] [AllStudent, AllTeacher, AllAdmin, Analyze::Graph::Column::AllData]
end end
def source
Analyze::Source::AllData.new(slices: [slice])
end
def slice
Analyze::Slice::AllData.new
end
end end
end end
end end

@ -32,9 +32,9 @@ module Analyze
:teacher :teacher
end end
def n_size(year_index) def n_size(academic_year)
SurveyItemResponse.where(survey_item: measure.teacher_survey_items, school:, SurveyItemResponse.where(survey_item: measure.teacher_survey_items, school:,
academic_year: academic_years[year_index]).select(:response_id).distinct.count academic_year:).pluck(:response_id).uniq.count
end end
end end
end end

@ -7,9 +7,9 @@ module Analyze
:student :student
end end
def n_size(year_index) def n_size(academic_year)
SurveyItemResponse.where(ell:, survey_item: measure.student_survey_items, school:, grade: grades, SurveyItemResponse.where(ell:, survey_item: measure.student_survey_items, school:, grade: grades,
academic_year: academic_years[year_index]).select(:response_id).distinct.count academic_year:).select(:response_id).distinct.count
end end
end end
end end

@ -7,9 +7,9 @@ module Analyze
:student :student
end end
def n_size(year_index) def n_size(academic_year)
SurveyItemResponse.where(gender:, survey_item: measure.student_survey_items, school:, grade: grades, SurveyItemResponse.where(gender:, survey_item: measure.student_survey_items, school:, grade: grades,
academic_year: academic_years[year_index]).select(:response_id).distinct.count academic_year:).select(:response_id).distinct.count
end end
end end
end end

@ -7,9 +7,9 @@ module Analyze
:student :student
end end
def n_size(year_index) def n_size(academic_year)
SurveyItemResponse.where(grade:, survey_item: measure.student_survey_items, school:, SurveyItemResponse.where(grade:, survey_item: measure.student_survey_items, school:,
academic_year: academic_years[year_index]).select(:response_id).distinct.count academic_year:).select(:response_id).distinct.count
end end
end end
end end

@ -34,10 +34,6 @@ module Analyze
raise NotImplementedError raise NotImplementedError
end end
def basis
""
end
def show_irrelevancy_message? def show_irrelevancy_message?
raise NotImplementedError raise NotImplementedError
end end

@ -7,9 +7,9 @@ module Analyze
:student :student
end end
def n_size(year_index) def n_size(academic_year)
SurveyItemResponse.where(income:, survey_item: measure.student_survey_items, school:, grade: grades, SurveyItemResponse.where(income:, survey_item: measure.student_survey_items, school:, grade: grades,
academic_year: academic_years[year_index]).select(:response_id).distinct.count academic_year:).select(:response_id).distinct.count
end end
end end
end end

@ -27,4 +27,3 @@ module Analyze
end end
end end
end end

@ -7,9 +7,9 @@ module Analyze
:student :student
end end
def n_size(year_index) def n_size(academic_year)
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: academic_years[year_index], school:, academic_year:,
survey_item: measure.student_survey_items survey_item: measure.student_survey_items
).where("student_races.race_id": race.id).select(:response_id).distinct.count ).where("student_races.race_id": race.id).select(:response_id).distinct.count
end end

@ -7,9 +7,9 @@ module Analyze
:student :student
end end
def n_size(year_index) def n_size(academic_year)
SurveyItemResponse.where(sped:, survey_item: measure.student_survey_items, school:, grade: grades, SurveyItemResponse.where(sped:, survey_item: measure.student_survey_items, school:, grade: grades,
academic_year: academic_years[year_index]).select(:response_id).distinct.count academic_year:).select(:response_id).distinct.count
end end
end end
end end

@ -5,16 +5,24 @@ module Analyze
class StudentsAndTeachers class StudentsAndTeachers
include Analyze::Graph::Column include Analyze::Graph::Column
def to_s def to_s
'Students & Teachers' "Students & Teachers"
end end
def slug def slug
'students-and-teachers' "students-and-teachers"
end end
def columns def columns
[AllStudent, AllTeacher, AllSurveyData] [AllStudent, AllTeacher, AllSurveyData]
end end
def source
Analyze::Source::SurveyData.new(slices: nil)
end
def slice
Analyze::Slice::StudentsAndTeachers.new
end
end end
end end
end end

@ -28,6 +28,14 @@ module Analyze
end end
end end
def source
Analyze::Source::SurveyData.new(slices: nil)
end
def slice
Analyze::Slice::StudentsByGroup.new
end
private private
def column_for_ell_code(code:) def column_for_ell_code(code:)

@ -28,6 +28,14 @@ module Analyze
end end
end end
def source
Analyze::Source::SurveyData.new(slices: nil)
end
def slice
Analyze::Slice::StudentsByGroup.new
end
private private
def column_for_gender_code(code:) def column_for_gender_code(code:)

@ -27,6 +27,14 @@ module Analyze
end end
end end
def source
Analyze::Source::SurveyData.new(slices: nil)
end
def slice
Analyze::Slice::StudentsByGroup.new
end
private private
def column_for_grade_code(code:) def column_for_grade_code(code:)

@ -26,6 +26,14 @@ module Analyze
end end
end end
def source
Analyze::Source::SurveyData.new(slices: nil)
end
def slice
Analyze::Slice::StudentsByGroup.new
end
private private
def column_for_income_code(code:) def column_for_income_code(code:)

@ -26,6 +26,14 @@ module Analyze
end end
end end
def source
Analyze::Source::SurveyData.new(slices: nil)
end
def slice
Analyze::Slice::StudentsByGroup.new
end
private private
def column_for_race_code(code:) def column_for_race_code(code:)

@ -27,6 +27,14 @@ module Analyze
end end
end end
def source
Analyze::Source::SurveyData.new(slices: nil)
end
def slice
Analyze::Slice::StudentsByGroup.new
end
private private
def column_for_sped_code(code:) def column_for_sped_code(code:)

@ -8,6 +8,10 @@ module Analyze
def slug def slug
"ell" "ell"
end end
def graph
Analyze::Graph::StudentsByEll.new(ells: nil)
end
end end
end end
end end

@ -2,11 +2,15 @@ module Analyze
module Group module Group
class Gender class Gender
def name def name
'Gender' "Gender"
end end
def slug def slug
'gender' "gender"
end
def graph
Analyze::Graph::StudentsByGender.new(genders: nil)
end end
end end
end end

@ -2,11 +2,15 @@ module Analyze
module Group module Group
class Grade class Grade
def name def name
'Grade' "Grade"
end end
def slug def slug
'grade' "grade"
end
def graph
Analyze::Graph::StudentsByGrade.new(grades: nil)
end end
end end
end end

@ -2,11 +2,15 @@ module Analyze
module Group module Group
class Income class Income
def name def name
'Income' "Income"
end end
def slug def slug
'income' "income"
end
def graph
Analyze::Graph::StudentsByIncome.new(incomes: nil)
end end
end end
end end

@ -2,11 +2,15 @@ module Analyze
module Group module Group
class Race class Race
def name def name
'Race' "Race"
end end
def slug def slug
'race' "race"
end
def graph
Analyze::Graph::StudentsByRace.new(races: nil)
end end
end end
end end

@ -8,6 +8,10 @@ module Analyze
def slug def slug
"sped" "sped"
end end
def graph
Analyze::Graph::StudentsBySped.new(speds: nil)
end
end end
end end
end end

@ -5,7 +5,6 @@ module Analyze
def initialize(params:, school:, academic_year:) def initialize(params:, school:, academic_year:)
@params = params @params = params
@school = school @school = school
@academic_year = academic_year
end end
def category def category
@ -34,10 +33,16 @@ module Analyze
def selected_academic_years def selected_academic_years
@selected_academic_years ||= begin @selected_academic_years ||= begin
year_params = params[:academic_years] array = []
return [] unless year_params
year_params.split(",").map { |year| AcademicYear.find_by_range(year) }.compact keys = params.keys.select { |key| key.start_with? "academic_year" }
keys.each do |key|
year_params = params[key]&.chomp
next if year_params.nil?
array << AcademicYear.find_by_range(year_params)
end
array
end end
end end
@ -46,12 +51,7 @@ module Analyze
end end
def selected_races def selected_races
@selected_races ||= begin @selected_races ||= selected_items(name: "race", list: races)
race_params = params[:races]
return races unless race_params
race_params.split(",").map { |race| Race.find_by_slug race }.compact
end
end end
def ells def ells
@ -59,12 +59,15 @@ module Analyze
end end
def selected_ells def selected_ells
@selected_ells ||= begin @selected_ells ||= selected_items(name: "ell", list: ells)
ell_params = params[:ells] end
return ells unless ell_params
ell_params.split(",").map { |ell| Ell.find_by_slug ell }.compact def selected_items(name:, list:)
end selected_params = params.select { |key, _| key.start_with?(name) && key.end_with?("checkbox") }
return list unless selected_params.keys.length.positive?
selected_params.values
.map { |slug| list.find { |item| item.slug == slug } }
end end
def speds def speds
@ -72,47 +75,20 @@ module Analyze
end end
def selected_speds def selected_speds
@selected_speds ||= begin @selected_speds ||= selected_items(name: "sped", list: speds)
sped_params = params[:speds]
return speds unless sped_params
sped_params.split(",").map { |sped| Sped.find_by_slug sped }.compact
end
end
def graphs
@graphs ||= [Analyze::Graph::AllData.new,
Analyze::Graph::StudentsAndTeachers.new,
Analyze::Graph::StudentsByRace.new(races: selected_races),
Analyze::Graph::StudentsByGrade.new(grades:),
Analyze::Graph::StudentsByGender.new(genders: selected_genders),
Analyze::Graph::StudentsByIncome.new(incomes: selected_incomes),
Analyze::Graph::StudentsByEll.new(ells: selected_ells),
Analyze::Graph::StudentsBySped.new(speds: selected_speds)]
end
def graph
@graph ||= graphs.reduce(graphs.first) do |acc, graph|
graph.slug == params[:graph] ? graph : acc
end
end end
def selected_grades def selected_grades
@selected_grades ||= begin @selected_grades ||= begin
grade_params = params[:grades] selected_params = params.select { |key, _| key.start_with?("grade") && key.end_with?("checkbox") }
return grades unless grade_params return grades unless selected_params.keys.length.positive?
grade_params.split(",").map(&:to_i) selected_params.values.map(&:to_i)
end end
end end
def selected_genders def selected_genders
@selected_genders ||= begin @selected_genders ||= selected_items(name: "gender", list: genders)
gender_params = params[:genders]
return genders unless gender_params
gender_params.split(",").sort.map { |gender| Gender.find_by_designation(gender) }.compact
end
end end
def genders def genders
@ -131,33 +107,53 @@ module Analyze
end end
def slice def slice
@slice ||= slices.reduce(slices.first) do |acc, slice| @slice ||= graph.slice || slices.first
slice.slug == params[:slice] ? slice : acc
end
end end
def slices def slices
source.slices graphs.map { |graph| graph.slice }.uniq
end end
def source def source
@source ||= sources.reduce(sources.first) do |acc, source| @source ||= graph&.source || sources.first
source.slug == params[:source] ? source : acc
end
end end
def sources def sources
all_data_slices = [Analyze::Slice::AllData.new] all_data_slice = Analyze::Slice::AllData.new
all_data_slice.graph = Analyze::Graph::AllData.new
all_data_slices = [all_data_slice]
all_data_source = Analyze::Source::AllData.new(slices: all_data_slices) all_data_source = Analyze::Source::AllData.new(slices: all_data_slices)
all_data_source.graph = Analyze::Graph::AllData.new
students_and_teachers = Analyze::Slice::StudentsAndTeachers.new students_and_teachers = Analyze::Slice::StudentsAndTeachers.new
students_by_group = Analyze::Slice::StudentsByGroup.new(races:, grades:) students_by_group = Analyze::Slice::StudentsByGroup.new
students_by_group.graph = Analyze::Graph::StudentsByEll.new(ells: selected_ells)
survey_data_slices = [students_and_teachers, students_by_group] survey_data_slices = [students_and_teachers, students_by_group]
survey_data_source = Analyze::Source::SurveyData.new(slices: survey_data_slices) survey_data_source = Analyze::Source::SurveyData.new(slices: survey_data_slices)
survey_data_source.graph = Analyze::Graph::StudentsAndTeachers.new
@sources = [all_data_source, survey_data_source] @sources = [all_data_source, survey_data_source]
end end
def graphs
@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),
Analyze::Graph::StudentsByIncome.new(incomes: selected_incomes),
Analyze::Graph::StudentsByEll.new(ells: selected_ells),
Analyze::Graph::StudentsBySped.new(speds: selected_speds)]
end
def graph
@graph ||= graphs.find do |graph|
graph.slug == params[:graph]
end || graphs.first
end
def grades def grades
@grades ||= SurveyItemResponse.where(school:, academic_year: academic_years) @grades ||= SurveyItemResponse.where(school:, academic_year: academic_years)
.where.not(grade: nil) .where.not(grade: nil)
@ -174,16 +170,12 @@ module Analyze
end end
def selected_incomes def selected_incomes
@selected_incomes ||= begin @selected_incomes ||= selected_items(name: "income", list: incomes)
income_params = params[:incomes]
return incomes unless income_params
income_params.split(",").map { |income| Income.find_by_slug(income) }.compact
end
end end
def cache_objects def cache_objects
[subcategory, [category,
subcategory,
selected_academic_years, selected_academic_years,
graph, graph,
selected_races, selected_races,

@ -1,16 +1,14 @@
module Analyze module Analyze
module Slice module Slice
class AllData class AllData
attr_accessor :graph
def to_s def to_s
'All Data' "All Data"
end end
def slug def slug
'all-data' "all-data"
end
def graphs
[Analyze::Graph::AllData.new]
end end
end end
end end

@ -2,15 +2,15 @@ module Analyze
module Slice module Slice
class StudentsAndTeachers class StudentsAndTeachers
def to_s def to_s
'Students & Teachers' "Students & Teachers"
end end
def slug def slug
'students-and-teachers' "students-and-teachers"
end end
def graphs def graph
[Analyze::Graph::StudentsAndTeachers.new] Analyze::Graph::StudentsAndTeachers.new
end end
end end
end end

@ -1,23 +1,14 @@
module Analyze module Analyze
module Slice module Slice
class StudentsByGroup class StudentsByGroup
attr_reader :races, :grades attr_accessor :graph
def initialize(races:, grades:)
@races = races
@grades = grades
end
def to_s def to_s
'Students by Group' "Students by Group"
end end
def slug def slug
'students-by-group' "students-by-group"
end
def graphs
[Analyze::Graph::StudentsByRace.new(races:), Analyze::Graph::StudentsByGrade.new(grades:)]
end end
end end
end end

@ -2,6 +2,7 @@ module Analyze
module Source module Source
class AllData class AllData
attr_reader :slices attr_reader :slices
attr_accessor :graph
include Analyze::Slice include Analyze::Slice
@ -10,11 +11,11 @@ module Analyze
end end
def to_s def to_s
'All Data' "All Data"
end end
def slug def slug
'all-data' "all-data"
end end
end end
end end

@ -2,6 +2,7 @@ module Analyze
module Source module Source
class SurveyData class SurveyData
attr_reader :slices attr_reader :slices
attr_accessor :graph
include Analyze::Slice include Analyze::Slice
@ -10,11 +11,11 @@ module Analyze
end end
def to_s def to_s
'Survey Data Only' "Survey Data Only"
end end
def slug def slug
'survey-data-only' "survey-data-only"
end end
end end
end end

@ -1,17 +1,13 @@
<div class="d-flex align-items-center mx-5"> <div class="d-flex align-items-center mx-5">
<input <input
id="<%= id %>" id="<%= id %>"
class="m-3 <%= name %>-checkbox form-check-input" class="m-3 form-check-input"
type="checkbox" type="checkbox"
name="<%= name %>-checkbox" name="<%= "#{name}#{index}" %>-checkbox"
value="<%= base_url %>" value="<%= item %>"
data-action="click->analyze#refresh"
<%= selected_items.include?(item) ? "checked" : "" %> <%= selected_items.include?(item) ? "checked" : "" %>
<%= @presenter.graph.slug == 'students-and-teachers' || @presenter.source.slug == 'all-data' ? "disabled" : "" %> >
<%= @presenter.group.slug == name ? "" : "hidden" %>> <label for="<%= id %>" >
<label for="<%= id %>"
<%= @presenter.group.slug == name ? "" : "hidden" %>>
<%= label_text %> <%= label_text %>
</label> </label>
</div> </div>

@ -1,41 +1,61 @@
<h3 class="sub-header-4 mt-5">Data Filters</h3> <h3 class="sub-header-4 mt-5">Data Filters</h3>
<div class="bg-gray p-3" data-controller="analyze"> <div class="bg-gray p-3">
<% @presenter.sources.each do |source| %> <% @presenter.sources.each do |source| %>
<%= form_with(url: district_school_analyze_index_path,
method: :get,
data: {
turbo_frame: "results",
turbo_action: "advance",
controller: "analyze",
action: "input->analyze#submit"
}) do |f| %>
<% params.reject{|key,_| key == "graph"}.each do |key, value| %>
<input type="hidden" id="year" name="<%= key %>" value="<%= value %>">
<% end %>
<input type="radio" <input type="radio"
id="<%= source.slug %>" id="<%= source.slug %>"
class="form-check-input" class="form-check-input"
name="source" name="graph"
value="<%= base_url %>" value="<%= source.graph.slug %>"
data-action="click->analyze#refresh"
<%= source.slug == @presenter.source.slug ? "checked" : "" %>> <%= source.slug == @presenter.source.slug ? "checked" : "" %>>
<label for="<%= source.slug %>"><%= source.to_s %></label> <label for="<%= source.slug %>"><%= source.to_s %></label>
<% source.slices.each do | slice | %> <% end %>
<div class="mx-3">
<input type="radio"
id="<%= slice.slug %>"
class="form-check-input"
name="slice"
value="<%= base_url %>"
data-action="click->analyze#refresh"
<%= slice.slug == @presenter.slice.slug ? "checked" : "" %>
<%= slice.slug == "all-data" ? "hidden" : "" %>>
<label for="<%= slice.slug %>"
<%= slice.slug == "all-data" ? "hidden" : "" %>>
<%= slice.to_s %></label>
</div>
<% end %>
<% end %>
<%= render partial: "group_selectors" %>
</div>
<script> <%= form_with(url: district_school_analyze_index_path,
window.source = "<%= @presenter.source.slug %>"; method: :get,
window.slice = "<%= @presenter.slice.slug %>"; data: {
window.group = "<%= @presenter.group.slug %>"; turbo_frame: "results",
window.graph = "<%= @presenter.graph.slug %>"; turbo_action: "advance",
</script> controller: "analyze",
action: "input->analyze#submit"
}) do |f| %>
<% params.reject{|key,_| key == "graph"}.each do |key, value| %>
<input type="hidden" id="year" name="<%= key %>" value="<%= value %>">
<% end %>
<% source.slices.each do | slice | %>
<div class="mx-3">
<input type="radio"
id="<%= slice.slug %>"
class="form-check-input"
name="graph"
value="<%= slice.graph.slug %>"
<%= slice.slug == @presenter.slice.slug ? "checked" : "" %>
<%= slice.slug == "all-data" ? "hidden" : "" %>>
<label for="<%= slice.slug %>"
<%= slice.slug == "all-data" ? "hidden" : "" %>>
<%= slice.to_s %></label>
</div>
<% end %>
<% end %>
<% end %>
<%= render partial: "group_selectors" %>
</div>

@ -1,14 +1,44 @@
<h3 class="sub-header-4">Focus Area</h3>
<p>Select a category & subcategory to analyze measure-level results</p> <h3 class="sub-header-4">Focus Area</h3>
<select id="select-category" class="mx-3 form-select" data-id="category-dropdown" data-action="analyze#refresh"> <p>Select a category & subcategory to analyze measure-level results</p>
<% categories.each do |category| %>
<option value="<%= analyze_category_link(district: district, school: school, academic_year: academic_year, category: category) %>" <%= category.id == @presenter.category.id ? "selected": "" %>><%= "#{category.category_id}: #{category.name}" %></option> <%= form_with(url: district_school_analyze_index_path,
method: :get,
data: {
turbo_frame: "results",
turbo_action: "advance",
controller: "analyze",
action: "input->analyze#submit"
}) do |f| %>
<% params.reject{|key,_| key.start_with?("category") || key.start_with?("subcategory")}.each do |key, value| %>
<input type="hidden" id="year" name="<%= key %>" value="<%= value %>">
<% end %> <% end %>
</select>
<select id="select-subcategory" class="mx-3 form-select mt-3" data-id="subcategory-dropdown" data-action="analyze#refresh"> <select id="select-category" class="mx-3 form-select" name="category" data-id="category-dropdown">
<% subcategories.each do |subcategory| %> <% categories.each do |category| %>
<option value="<%= analyze_subcategory_link(district: district, school: school, academic_year: academic_year, category: category, subcategory: subcategory) %>" <%= subcategory.subcategory_id == @presenter.subcategory.subcategory_id ? "selected": "" %>> <option value="<%= category.category_id %>" <%= category.category_id == @presenter.category.category_id ? "selected": "" %>><%= "#{category.category_id}: #{category.name}" %></option>
<%= "#{subcategory.subcategory_id}: #{subcategory.name}" %> <% end %>
</option> </select>
<% end %>
<%= form_with(url: district_school_analyze_index_path,
method: :get,
data: {
turbo_frame: "results",
turbo_action: "advance",
controller: "analyze",
action: "input->analyze#submit"
}) do |f| %>
<% params.each do |key, value| %>
<input type="hidden" id="year" name="<%= key %>" value="<%= value %>">
<% end %> <% end %>
</select>
<select id="select-subcategory" class="mx-3 form-select mt-3" name="subcategory" data-id="subcategory-dropdown">
<% subcategories.each do |subcategory| %>
<option value="<%= subcategory.subcategory_id %>" <%= subcategory.subcategory_id == @presenter.subcategory.subcategory_id ? "selected": "" %>>
<%= "#{subcategory.subcategory_id}: #{subcategory.name}" %>
</option>
<% end %>
</select>
<% end %>

@ -1,31 +1,60 @@
<select id="select-group" name="group" class="mx-4 form-select" data-id="group-dropdown" data-action="analyze#refresh"> <%= form_with(url: district_school_analyze_index_path,
<% @presenter.groups.each do |group| %> method: :get,
<option id="<%= group.slug %>" name="group-option" value="<%= base_url %>" <%= group.slug == @presenter.group.slug ? "Selected": "" %>><%= group.name %> </option> data: {
turbo_frame: "results",
turbo_action: "advance",
controller: "analyze",
action: "input->analyze#submit"
}) do |f| %>
<% params.reject{|key,_| key == "graph" || key.end_with?("checkbox")}.each do |key, value| %>
<input type="hidden" id="year" name="<%= key %>" value="<%= value %>">
<% end %> <% end %>
</select>
<p class="sub-header-5 mx-4 mt-3 font-size-14"> Select a group </p> <select id="select-group" name="graph" class="mx-4 form-select" data-id="group-dropdown">
<% @presenter.groups.each do |group| %>
<option id="<%= group.slug %>" value="<%= group.graph.slug %>" <%= group.graph.slug == @presenter.graph.slug ? "Selected": "" %>><%= group.name %> </option>
<% end %>
</select>
<p class="sub-header-5 mx-4 mt-3 font-size-14"> Select a group </p>
<% if @presenter.graph.slug == 'students-by-race' %>
<% @presenter.races.each_with_index do |race, index| %>
<%= render(partial: "checkboxes", locals: {id: "race-#{}#{race.slug}", item: race.slug, selected_items: @presenter.selected_races.map(&:slug), name: "race", label_text: race.designation, index: index })%>
<% end %>
<% end %>
<% @presenter.races.each do |race| %> <% if @presenter.graph.slug == 'students-by-grade' %>
<%= render(partial: "checkboxes", locals: {id: "race-#{race.slug}", item: race, selected_items: @presenter.selected_races, name: "race", label_text: race.designation}) %> <% @presenter.grades.each_with_index do |grade, index| %>
<%= render(partial: "checkboxes", locals: {id: "grade-#{grade}", item: grade, selected_items: @presenter.selected_grades, name: "grade", label_text: grade, index: index }) %>
<% end %>
<% end %> <% end %>
<% @presenter.grades.each do |grade| %> <% if @presenter.graph.slug == 'students-by-gender' %>
<%= render(partial: "checkboxes", locals: {id: "grade-#{grade}", item: grade, selected_items: @presenter.selected_grades, name: "grade", label_text: grade}) %> <% @presenter.genders.each_with_index do |gender, index| %>
<%= render(partial: "checkboxes", locals: {id: "gender-#{gender.designation}", item: gender.slug, selected_items: @presenter.selected_genders.map(&:slug), name: "gender", label_text: gender.designation, index: index }) %>
<% end %>
<% end %> <% end %>
<% @presenter.genders.each do |gender| %> <% if @presenter.graph.slug == 'students-by-income' %>
<%= render(partial: "checkboxes", locals: {id: "gender-#{gender.designation}", item: gender, selected_items: @presenter.selected_genders, name: "gender", label_text: gender.designation}) %> <% @presenter.incomes.each_with_index do |income, index| %>
<%= render(partial: "checkboxes", locals: {id: "income-#{income.slug}", item: income.slug, selected_items: @presenter.selected_incomes.map(&:slug), name: "income", label_text: income.label, index: index })%>
<% end %>
<% end %> <% end %>
<% @presenter.incomes.each do |income| %> <% if @presenter.graph.slug == 'students-by-ell' %>
<%= render(partial: "checkboxes", locals: {id: "income-#{income.slug}", item: income, selected_items: @presenter.selected_incomes, name: "income", label_text: income.label}) %> <% @presenter.ells.each_with_index do |ell, index| %>
<%= render(partial: "checkboxes", locals: {id: "ell-#{ell.slug}", item: ell.slug, selected_items: @presenter.selected_ells.map(&:slug), name: "ell", label_text: ell.designation, index: index}) %>
<% end %>
<% end %> <% end %>
<% @presenter.ells.each do |ell| %> <% if @presenter.graph.slug == 'students-by-sped' %>
<%= render(partial: "checkboxes", locals: {id: "ell-#{ell.slug}", item: ell, selected_items: @presenter.selected_ells, name: "ell", label_text: ell.designation}) %> <% @presenter.speds.each_with_index do |sped, index| %>
<%= render(partial: "checkboxes", locals: {id: "sped-#{sped.slug}", item: sped.slug, selected_items: @presenter.selected_speds.map(&:slug), name: "sped", label_text: sped.designation, index: index}) %>
<% end %>
<% end %> <% end %>
<% @presenter.speds.each do |sped| %>
<%= render(partial: "checkboxes", locals: {id: "sped-#{sped.slug}", item: sped, selected_items: @presenter.selected_speds, name: "sped", label_text: sped.designation}) %>
<% end %> <% end %>

@ -6,5 +6,4 @@
<% p = column.new(measure: measure, school: @school, academic_years: @presenter.selected_academic_years, position: index , number_of_columns:) %> <% p = column.new(measure: measure, school: @school, academic_years: @presenter.selected_academic_years, position: index , number_of_columns:) %>
<%= render partial: "grouped_bar_column", locals: {column: p} %> <%= render partial: "grouped_bar_column", locals: {column: p} %>
<% end %> <% end %>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 493 B

After

Width:  |  Height:  |  Size: 492 B

@ -5,7 +5,7 @@
<% if column.show_popover? %> <% if column.show_popover? %>
data-bs-toggle="popover" data-bs-toggle="popover"
data-bs-placement="right" data-bs-placement="right"
data-bs-content="<%= column.popover_content(index) %>" data-bs-content="<%= column.popover_content(bar.academic_year) %>"
<% end %> <% end %>
data-for-academic-year="<%= bar.academic_year.range %>" data-for-academic-year="<%= bar.academic_year.range %>"

@ -1,13 +1,24 @@
<%= form_with(url: district_school_analyze_index_path,
method: :get,
data: {
turbo_frame: "results",
turbo_action: "advance",
controller: "form",
action: "input->form#submit"
}) do |f| %>
<% params.reject{|key,_| key.start_with?("academic_year")}.each do |key, value| %>
<input type="hidden" id="year" name="<%= key %>" value="<%= value %>">
<% end %>
<h3 class="sub-header-4 mt-5">School Years</h3> <h3 class="sub-header-4 mt-5">School Years</h3>
<% available_academic_years.each_with_index do | year, index | %> <% available_academic_years.each_with_index do | year, index | %>
<div class="d-flex justify-content-start align-items-center mt-1" data-controller="analyze"> <div class="d-flex justify-content-start align-items-center mt-1" data-controller="analyze">
<input type="checkbox" <input type="checkbox"
class="form-check-input" class="form-check-input"
id="<%= year.range %>" id="<%= year.range %>"
name="year-checkbox" name="academic_year-<%= index %>"
value="<%= analyze_subcategory_link(district: district, school: school, academic_year: academic_year, category: category, subcategory: subcategory) %>" value="<%= year.range %>"
<%= selected_academic_years.include?(year) ? "checked" : "" %> <%= selected_academic_years.include?(year) ? "checked" : "" %>
data-action="click->analyze#refresh"
<% empty_dataset = empty_dataset?(measures: measures, school: school, academic_year: year) %> <% empty_dataset = empty_dataset?(measures: measures, school: school, academic_year: year) %>
<% empty_survey_dataset = empty_survey_dataset?(measures: measures, school: school, academic_year: year) %> <% empty_survey_dataset = empty_survey_dataset?(measures: measures, school: school, academic_year: year) %>
<% if graph.slug == 'all-data' %> <% if graph.slug == 'all-data' %>
@ -32,3 +43,4 @@
<% end %> <% end %>
</div> </div>
<% end %> <% end %>
<% end %>

@ -0,0 +1,6 @@
class AddSlugToGender < ActiveRecord::Migration[7.1]
def change
add_column :genders, :slug, :string
add_index :genders, :slug, unique: true
end
end

@ -0,0 +1,6 @@
class AddSlugToAcademicYear < ActiveRecord::Migration[7.1]
def change
add_column :academic_years, :slug, :string
add_index :academic_years, :slug, unique: true
end
end

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.1].define(version: 2023_12_27_183313) do ActiveRecord::Schema[7.1].define(version: 2024_06_07_205816) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "pg_stat_statements" enable_extension "pg_stat_statements"
enable_extension "plpgsql" enable_extension "plpgsql"
@ -19,7 +19,9 @@ ActiveRecord::Schema[7.1].define(version: 2023_12_27_183313) do
t.string "range", null: false t.string "range", null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.string "slug"
t.index ["range"], name: "index_academic_years_on_range", unique: true t.index ["range"], name: "index_academic_years_on_range", unique: true
t.index ["slug"], name: "index_academic_years_on_slug", unique: true
end end
create_table "admin_data_items", force: :cascade do |t| create_table "admin_data_items", force: :cascade do |t|
@ -83,6 +85,8 @@ ActiveRecord::Schema[7.1].define(version: 2023_12_27_183313) do
t.string "designation" t.string "designation"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.string "slug"
t.index ["slug"], name: "index_genders_on_slug", unique: true
end end
create_table "incomes", force: :cascade do |t| create_table "incomes", force: :cascade do |t|

Loading…
Cancel
Save