From fd8cb093e0ad4f4a96aec38f99b6d3d0a0544f05 Mon Sep 17 00:00:00 2001
From: Arnaud Levy <contact@arnaudlevy.com>
Date: Wed, 27 Apr 2022 16:46:13 +0200
Subject: [PATCH] facets

---
 app/controllers/extranet/cohorts_controller.rb | 10 +++++++++-
 app/models/education/academic_year.rb          |  5 ++++-
 app/models/education/cohort.rb                 | 15 ++++++++++++---
 app/models/education/cohort/facets.rb          | 18 ++++++++++++++++++
 app/models/education/program.rb                |  6 ++++--
 app/models/education/school.rb                 |  8 +++++---
 app/views/extranet/cohorts/index.html.erb      |  5 +++++
 7 files changed, 57 insertions(+), 10 deletions(-)
 create mode 100644 app/models/education/cohort/facets.rb

diff --git a/app/controllers/extranet/cohorts_controller.rb b/app/controllers/extranet/cohorts_controller.rb
index e25c966f2..62ee6a560 100644
--- a/app/controllers/extranet/cohorts_controller.rb
+++ b/app/controllers/extranet/cohorts_controller.rb
@@ -4,7 +4,15 @@ class Extranet::CohortsController < Extranet::ApplicationController
                               through_association: :education_cohorts
 
   def index
-    @cohorts = current_extranet.about&.cohorts || @cohorts
+    @facets = Education::Cohort::Facets.new params[:facets], {
+      model: about.cohorts,
+      about: about
+    }
+    @cohorts = @facets.results
+                      .ordered
+                      .page(params[:page])
+                      .per(60)
+    @count = @cohorts.total_count
     breadcrumb
   end
 
diff --git a/app/models/education/academic_year.rb b/app/models/education/academic_year.rb
index ac8936997..1002b03ca 100644
--- a/app/models/education/academic_year.rb
+++ b/app/models/education/academic_year.rb
@@ -19,7 +19,10 @@
 class Education::AcademicYear < ApplicationRecord
   include WithUniversity
 
-  has_many :cohorts, class_name: 'Education::Cohort'
+  has_many  :education_cohorts,
+            class_name: 'Education::Cohort'
+  has_many  :cohorts,
+            class_name: 'Education::Cohort'
 
   # Dénormalisation des alumni pour le faceted search
   has_and_belongs_to_many   :university_people,
diff --git a/app/models/education/cohort.rb b/app/models/education/cohort.rb
index 1d1aceba4..b513e77a8 100644
--- a/app/models/education/cohort.rb
+++ b/app/models/education/cohort.rb
@@ -24,14 +24,23 @@
 #
 class Education::Cohort < ApplicationRecord
   include WithUniversity
-  belongs_to :program, class_name: 'Education::Program'
-  belongs_to :academic_year, class_name: 'Education::AcademicYear'
+
+  belongs_to  :program,
+              class_name: 'Education::Program'
+              alias_attribute :education_program, :program
+
+  belongs_to  :academic_year,
+              class_name: 'Education::AcademicYear'
+              alias_attribute :education_academic_year, :academic_year
+
   has_and_belongs_to_many :people,
                           class_name: 'University::Person',
                           foreign_key: 'education_cohort_id',
                           association_foreign_key: 'university_person_id'
 
-  scope :ordered, -> { includes(:academic_year).order('education_academic_years.year DESC') }
+  scope :ordered, -> {
+    includes(:academic_year).order('education_academic_years.year DESC')
+  }
 
   def to_s
     "#{program} #{academic_year} #{name}"
diff --git a/app/models/education/cohort/facets.rb b/app/models/education/cohort/facets.rb
new file mode 100644
index 000000000..90298cd6d
--- /dev/null
+++ b/app/models/education/cohort/facets.rb
@@ -0,0 +1,18 @@
+class Education::Cohort::Facets < FacetedSearch::Facets
+  def initialize(params, options)
+    super params
+
+    @model = options[:model]
+    @about = options[:about]
+
+    filter_with_list :academic_years, {
+      source: @about.academic_years.ordered,
+      title: Education::AcademicYear.model_name.human(count: 2)
+    }
+
+    filter_with_checkboxes :programs, {
+      source: @about.programs.ordered,
+      title: Education::Program.model_name.human(count: 2)
+    } unless @about.is_a? Education::Program
+  end
+end
diff --git a/app/models/education/program.rb b/app/models/education/program.rb
index 0f61d2ac8..e14169b09 100644
--- a/app/models/education/program.rb
+++ b/app/models/education/program.rb
@@ -113,6 +113,8 @@ class Education::Program < ApplicationRecord
 
   has_many   :cohorts,
              class_name: 'Education::Cohort'
+  has_many   :education_cohorts,
+             class_name: 'Education::Cohort'
 
   has_many   :alumni,
              through: :cohorts,
@@ -123,7 +125,7 @@ class Education::Program < ApplicationRecord
              class_name: 'University::Person::Experience',
              through: :alumni,
              source: :experiences
-  alias_attribute :experiences, :alumni_experiences
+             alias_attribute :experiences, :alumni_experiences
 
   has_many   :alumni_organizations,
              -> { distinct },
@@ -136,7 +138,7 @@ class Education::Program < ApplicationRecord
              class_name: 'Education::AcademicYear',
              through: :cohorts,
              source: :academic_year
-  alias_attribute :academic_years, :education_academic_years
+             alias_attribute :academic_years, :education_academic_years
 
   # Dénormalisation des alumni pour le faceted search
   has_and_belongs_to_many :university_people,
diff --git a/app/models/education/school.rb b/app/models/education/school.rb
index bc0b0684c..b7dc8fbd8 100644
--- a/app/models/education/school.rb
+++ b/app/models/education/school.rb
@@ -38,7 +38,9 @@ class Education::School < ApplicationRecord
                           join_table: 'education_programs_schools',
                           foreign_key: 'education_school_id',
                           association_foreign_key: 'education_program_id'
+
   belongs_to  :university
+
   has_many    :websites,
               class_name: 'Communication::Website',
               as: :about,
@@ -74,7 +76,7 @@ class Education::School < ApplicationRecord
               class_name: 'University::Person::Experience',
               through: :alumni,
               source: :experiences
-  alias_attribute :experiences, :alumni_experiences
+              alias_attribute :experiences, :alumni_experiences
 
   has_many    :alumni_organizations,
               -> { distinct },
@@ -86,13 +88,13 @@ class Education::School < ApplicationRecord
               -> { distinct },
               class_name: 'Education::AcademicYear',
               through: :programs
-  alias_attribute :academic_years, :education_academic_years
+              alias_attribute :academic_years, :education_academic_years
 
   has_many    :education_cohorts, -> { distinct },
               class_name: 'Education::Cohort',
               through: :programs,
               source: :cohorts
-  alias_attribute :cohorts, :education_cohorts
+              alias_attribute :cohorts, :education_cohorts
 
   validates :name, :address, :city, :zipcode, :country, presence: true
 
diff --git a/app/views/extranet/cohorts/index.html.erb b/app/views/extranet/cohorts/index.html.erb
index eed8f4024..75dc9e5ed 100644
--- a/app/views/extranet/cohorts/index.html.erb
+++ b/app/views/extranet/cohorts/index.html.erb
@@ -2,10 +2,15 @@
 
 <header class="mb-5">
   <h1><%= Education::Cohort.model_name.human(count: 2) %></h1>
+  <p>
+    <%= @count %>
+    <%= Education::Cohort.model_name.human(count: @count).downcase %>
+  </p>
 </header>
 
 <div class="row">
   <div class="col-md-3">
+    <%= render 'faceted_search/facets', facets: @facets %>
     <div class="facets">
       <div class="mb-4">
         <%= render 'extranet/application/facets/years' %>
-- 
GitLab