diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index bb886b5f..62232582 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -2,10 +2,53 @@ class HomeController < ApplicationController helper HeaderHelper + def index - @districts = District.all.order(:name) - @schools = School.all.includes([:district]).order(:name) + @districts = districts + @district = district + + @schools = schools + @school = school + @year = year @categories = Category.sorted.map { |category| CategoryPresenter.new(category:) } end + + private + + def districts + District.all.order(:name).map do |district| + [district.name, district.id] + end + end + + def district + return District.first if District.count == 1 + + District.find(params[:district]) if params[:district].present? + end + + def schools + if district.present? + district.schools.order(:name).map do |school| + [school.name, school.id] + end + else + [] + end + end + + def school + School.find(params[:school]) if params[:school].present? + end + + def year + latest_response_rate = ResponseRate.where(school:) + .where('meets_student_threshold = ? or meets_teacher_threshold = ?', true, true) + .joins('inner join academic_years a on response_rates.academic_year_id=a.id') + .order('a.range DESC').first + academic_year = latest_response_rate.academic_year.range if latest_response_rate.present? + + academic_year || AcademicYear.order('range DESC').first.range + end end diff --git a/app/helpers/header_helper.rb b/app/helpers/header_helper.rb index b0a45fcd..e9e5bef5 100644 --- a/app/helpers/header_helper.rb +++ b/app/helpers/header_helper.rb @@ -34,26 +34,6 @@ module HeaderHelper end end - def school_mapper(school) - academic_year = latest_year(school) - { - name: school.name, - district_id: school.district_id, - url: district_school_overview_index_path(school.district, school, - { year: academic_year.range }) - } - end - - def latest_year(school) - latest_response_rate = ResponseRate.where(school:) - .where('meets_student_threshold = ? or meets_teacher_threshold = ?', true, true) - .joins('inner join academic_years a on response_rates.academic_year_id=a.id') - .order('a.range DESC').first - academic_year = latest_response_rate.academic_year if latest_response_rate.present? - - academic_year || AcademicYear.order('range DESC').first - end - def link_weight(path:) active?(path:) ? 'weight-700' : 'weight-400' end diff --git a/app/javascript/application.js b/app/javascript/application.js index 3b1eddd3..4ef74fe8 100644 --- a/app/javascript/application.js +++ b/app/javascript/application.js @@ -9,12 +9,10 @@ import { initializeListenersForNavDropdowns, initializePopovers, } from "./overview"; -import { initializeListenersForHomeDropdowns } from "./home"; import { showEmptyDatasetModal } from "./modal"; document.addEventListener("turbo:load", () => { initializeListenersForNavDropdowns(); - initializeListenersForHomeDropdowns(); initializePopovers(); showEmptyDatasetModal(); }); diff --git a/app/javascript/controllers/form_controller.js b/app/javascript/controllers/form_controller.js new file mode 100644 index 00000000..1eaf90be --- /dev/null +++ b/app/javascript/controllers/form_controller.js @@ -0,0 +1,13 @@ +import { Controller } from "@hotwired/stimulus" +import debounce from "debounce"; + +// Connects to data-controller="form" +export default class extends Controller { + initialize() { + this.submit = debounce(this.submit.bind(this), 300) + } + + submit() { + this.element.requestSubmit(); + } +} diff --git a/app/javascript/controllers/index.js b/app/javascript/controllers/index.js index 6a4079b7..e758a81f 100644 --- a/app/javascript/controllers/index.js +++ b/app/javascript/controllers/index.js @@ -6,3 +6,6 @@ import { application } from "./application" import AnalyzeController from "./analyze_controller.js" application.register("analyze", AnalyzeController) + +import FormController from "./form_controller.js" +application.register("form", FormController) diff --git a/app/javascript/home.js b/app/javascript/home.js deleted file mode 100644 index 4cf80ff0..00000000 --- a/app/javascript/home.js +++ /dev/null @@ -1,49 +0,0 @@ -import 'bootstrap'; - -export function initializeListenersForHomeDropdowns() { - const districtDropdown = document.querySelector("#district-dropdown"); - if (districtDropdown) { - const schoolDropdown = document.querySelector("#school-dropdown"); - districtDropdown.addEventListener("change", (event) => { - const districtId = Number(event.target.value); - const schoolsInDistrict = window.schools.filter( - (school) => school.district_id === districtId - ); - - schoolDropdown.replaceChildren( - ...schoolsInDistrict.map((school) => { - return createOptionForSelect(school.name, school.url, false); - }) - ); - - let optionElem = createOptionForSelect("Select a school", schoolDropdown.firstChild.value, true) - schoolDropdown.insertBefore(optionElem, schoolDropdown.firstChild); - - schoolDropdown.disabled = false; - }); - - schoolDropdown.addEventListener("change", (event) => { - const goButton = document.querySelector('button[data-id="go-to-school"]'); - goButton.disabled = false; - }); - - document - .querySelector('button[data-id="go-to-school"]') - .addEventListener("click", (event) => { - const selectedSchoolURL = schoolDropdown.value; - window.location = selectedSchoolURL; - }); - } -} - -function createOptionForSelect(name, value, selected) { - const optionElem = document.createElement("option"); - optionElem.setAttribute("value", value); - - if (selected === true) { - optionElem.setAttribute("selected", "selected"); - } - const schoolNameNode = document.createTextNode(name); - optionElem.appendChild(schoolNameNode); - return optionElem; -} diff --git a/app/views/home/index.html.erb b/app/views/home/index.html.erb index 69d4e23a..617adf9b 100644 --- a/app/views/home/index.html.erb +++ b/app/views/home/index.html.erb @@ -2,20 +2,46 @@
A school quality framework with multiple measures that offers a fair and comprehensive - picture of school performance
+ picture of school performanceThe School Quality Measures Framework aims to describe the full measure of what makes a good - school. The three outer categories are essential inputs to school quality that influence the center two key - outcomes.
+ school. The three outer categories are essential inputs to school quality that influence the center two key + outcomes.