diff --git a/app/controllers/admin/education/programs_controller.rb b/app/controllers/admin/education/programs_controller.rb index ef52df18a37196afe44f7bd304cf782911f3ec1c..d928c482a8427c29d16427b0ec3bf63172fd4a30 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 adc5069cb6ef7b61c345db72e19dd5ab79c6e6ab..c96a5bcc0631b6bbe794b33c9940d74392218b55 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 1a504550165153dafa8d97b8b2fac27e951b85bf..004ccd957a732bf000fd4c8d5a1198c48e54c1c1 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 cad98a94ce61050b304b8bf7d70bdab4518a431c..274caa93f6a02f76e9afffe81b01e6c9bb1b605d 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 bf7ad5710665b4c916e9a6fc217f40414709fd74..3d0e54f67e843123da525d1271bcb9de5499ba74 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 eb3f1b12477f09823eedbca297bcf3d10623a27c..7c0cd5413d5caf4c415dfbde612bace3a257c175 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 cda0dc8fe472e488414f37b7f90e479a2266e48e..509c363e7f7491be56d547555157f368a9b89fb4 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