From 69179ce157a47cd14e9a51835479759b63821ae6 Mon Sep 17 00:00:00 2001
From: rebuilt
Date: Sat, 10 Dec 2022 14:07:58 -0800
Subject: [PATCH] Replace javascript logic with hotwire. Also hide district
dropdown on home page if there is only one district.
---
app/controllers/home_controller.rb | 47 +-
app/helpers/header_helper.rb | 20 -
app/javascript/application.js | 2 -
app/javascript/controllers/form_controller.js | 13 +
app/javascript/controllers/index.js | 3 +
app/javascript/home.js | 49 -
app/views/home/index.html.erb | 42 +-
app/views/layouts/home.html.erb | 3 -
data/admin_data/dese/5C_1_art_course.csv | 1777 ++++++++++++
package.json | 3 +-
spec/controllers/home_controller_spec.rb | 5 +
spec/javascript/home.spec.js | 94 -
spec/system/journey_spec.rb | 5 +
spec/views/home/index.html.erb_spec.rb | 2 +
yarn-error.log | 2422 +++++++++--------
yarn.lock | 5 +
16 files changed, 3228 insertions(+), 1264 deletions(-)
create mode 100644 app/javascript/controllers/form_controller.js
delete mode 100644 app/javascript/home.js
delete mode 100644 spec/javascript/home.spec.js
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 performance
- <%= collection_select(:district, :id, @districts, :id, :name, { prompt: 'Select a district', selected: "" }, { id: 'district-dropdown', 'data-id': 'district-dropdown', class: 'form-select' }) %>
-
- Select a school
-
+ <%= form_with(url: welcome_path, method: :get,
+ data: {
+ turbo_frame: "schools",
+ turbo_action: "advance",
+ controller: "form",
+ action: "input->form#submit"
+ }) do |f| %>
+
+ <%= turbo_frame_tag "schools" do %>
+
+ <% if District.count > 1 %>
+
+ <%= f.select :district, @districts,
+ {include_blank: "Select a District", selected: params[:district] } , {id: "district-dropdown", class: "form-select", hidden: @districts.count == 1} %>
+
+ <% end %>
+
+
+ <%= f.select :school, @schools,
+ {include_blank: "Select a School", selected: params[:school]}, { id: "school-dropdown", class: "form-select mx-3"} if @schools %>
+
+
+ <% if @school.present? %>
+ <%= link_to "Go", district_school_overview_index_path(@district, @school, {year: @year} ), class: "mx-4 btn btn-secondary" , data: {turbo_frame: "_top"} %>
+ <% else %>
+ <%= button_to "Go", "/", class: "mx-4 btn btn-secondary" , data: {turbo_frame: "_top"}, disabled: true %>
+ <% end %>
+
+
+ <% end %>
+ <% end %>
-
Go
@@ -30,8 +56,8 @@
The 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.
School Quality Measures Framework
diff --git a/app/views/layouts/home.html.erb b/app/views/layouts/home.html.erb
index c2e0c9ef..e45b0fd3 100644
--- a/app/views/layouts/home.html.erb
+++ b/app/views/layouts/home.html.erb
@@ -27,8 +27,5 @@
<%= render partial: 'layouts/footer' %>
-