From 045f54585b2a5d00c029e9ae836410b43a8d793c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= <sebastien.gaya@gmail.com>
Date: Fri, 17 Dec 2021 14:46:21 +0100
Subject: [PATCH] program featured image

---
 .../admin/education/programs_controller.rb         |  1 +
 app/models/communication/website/with_media.rb     | 12 +++++++++++-
 app/models/education/program.rb                    |  2 ++
 app/views/admin/education/programs/_form.html.erb  | 14 ++++++++++++++
 app/views/admin/education/programs/show.html.erb   | 10 ++++++++++
 config/locales/education/en.yml                    |  1 +
 config/locales/education/fr.yml                    |  1 +
 7 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/app/controllers/admin/education/programs_controller.rb b/app/controllers/admin/education/programs_controller.rb
index ef52df18a..d928c482a 100644
--- a/app/controllers/admin/education/programs_controller.rb
+++ b/app/controllers/admin/education/programs_controller.rb
@@ -80,6 +80,7 @@ class Admin::Education::ProgramsController < Admin::Education::ApplicationContro
   def program_params
     params.require(:education_program).permit(
       :name, :slug, :level, :capacity, :ects, :continuing, :description, :published,
+      :featured_image, :featured_image_delete, :featured_image_infos,
       :prerequisites, :objectives, :duration, :registration, :pedagogy,
       :evaluation, :accessibility, :pricing, :contacts, :opportunities, :other,
       :parent_id, school_ids: [], teacher_ids: []
diff --git a/app/models/communication/website/with_media.rb b/app/models/communication/website/with_media.rb
index adc5069cb..c96a5bcc0 100644
--- a/app/models/communication/website/with_media.rb
+++ b/app/models/communication/website/with_media.rb
@@ -2,10 +2,20 @@ module Communication::Website::WithMedia
   extend ActiveSupport::Concern
 
   def active_storage_blobs
-    blob_ids = [best_featured_image&.blob_id, text.embeds.blobs.pluck(:id)].flatten.compact
+    blob_ids = [best_featured_image&.blob_id, rich_text_blob_ids].flatten.compact
     university.active_storage_blobs.where(id: blob_ids)
   end
 
+  def rich_text_reflection_names
+    @rich_text_reflection_names ||= _reflections.select { |name, reflection| reflection.class_name == "ActionText::RichText" }.keys
+  end
+
+  def rich_text_blob_ids
+    rich_text_reflection_names.map { |rich_text_reflection_name|
+      public_send(rich_text_reflection_name).embeds.blobs.pluck(:id)
+    }.flatten
+  end
+
   # Can be overwrite to get featured_image from associated objects (ex: parents)
   def best_featured_image(fallback: true)
     featured_image
diff --git a/app/models/education/program.rb b/app/models/education/program.rb
index 1a5045501..004ccd957 100644
--- a/app/models/education/program.rb
+++ b/app/models/education/program.rb
@@ -32,6 +32,7 @@ class Education::Program < ApplicationRecord
   include WithGithubFiles
   include WithMenuItemTarget
   include WithTree
+  include Communication::Website::WithMedia
 
   attr_accessor :skip_websites_categories_callback
 
@@ -46,6 +47,7 @@ class Education::Program < ApplicationRecord
   has_rich_text :prerequisites
   has_rich_text :pricing
   has_rich_text :registration
+  has_one_attached_deletable :featured_image
 
   belongs_to :university
   belongs_to :parent,
diff --git a/app/views/admin/education/programs/_form.html.erb b/app/views/admin/education/programs/_form.html.erb
index cad98a94c..274caa93f 100644
--- a/app/views/admin/education/programs/_form.html.erb
+++ b/app/views/admin/education/programs/_form.html.erb
@@ -24,6 +24,20 @@
           <%= f.association :parent, collection: program.persisted? ? program.list_of_other_programs : current_university.list_of_programs, label_method: ->(p) { sanitize p[:label] }, value_method: ->(p) { p[:id] } %>
         </div>
       </div>
+      <div class="card flex-fill w-100">
+        <div class="card-header">
+          <h5 class="card-title mb-0"><%= t('activerecord.attributes.education/program.featured_image') %></h5>
+        </div>
+        <div class="card-body">
+          <%= f.input :featured_image,
+                      as: :single_deletable_file,
+                      direct_upload: true,
+                      label: false,
+                      input_html: { accept: '.jpg,.jpeg,.png' },
+                      preview: true
+           %>
+        </div>
+      </div>
     </div>
     <div class="col-md-8">
       <div class="card flex-fill w-100">
diff --git a/app/views/admin/education/programs/show.html.erb b/app/views/admin/education/programs/show.html.erb
index bf7ad5710..3d0e54f67 100644
--- a/app/views/admin/education/programs/show.html.erb
+++ b/app/views/admin/education/programs/show.html.erb
@@ -28,6 +28,16 @@
         <% end %>
       </div>
     </div>
+    <% if @program.featured_image.attached? && @program.featured_image.variable? %>
+      <div class="card flex-fill w-100">
+        <div class="card-header">
+          <h5 class="card-title mb-0"><%= t('activerecord.attributes.education/program.featured_image') %></h5>
+        </div>
+        <div class="card-body">
+          <%= image_tag @program.featured_image.variant(resize: '600'), class: 'img-fluid mb-3' %><br>
+        </div>
+      </div>
+    <% end %>
   </div>
   <div class="col-md-8">
     <div class="card flex-fill w-100">
diff --git a/config/locales/education/en.yml b/config/locales/education/en.yml
index eb3f1b124..7c0cd5413 100644
--- a/config/locales/education/en.yml
+++ b/config/locales/education/en.yml
@@ -20,6 +20,7 @@ en:
         duration: Durée
         ects: Crédits ECTS
         evaluation: Modalités d’évaluation
+        featured_image: Featured image
         level: Level
         name: Name
         objectives: Objectifs
diff --git a/config/locales/education/fr.yml b/config/locales/education/fr.yml
index cda0dc8fe..509c363e7 100644
--- a/config/locales/education/fr.yml
+++ b/config/locales/education/fr.yml
@@ -20,6 +20,7 @@ fr:
         duration: Durée
         ects: Crédits ECTS
         evaluation: Modalités d’évaluation
+        featured_image: Image à la une
         level: Niveau
         name: Nom
         objectives: Objectifs
-- 
GitLab