diff --git a/Gemfile b/Gemfile index 5c8226bb65..2cc529457c 100644 --- a/Gemfile +++ b/Gemfile @@ -75,7 +75,7 @@ gem "rbnacl", "~> 7.1" gem "redis", "~> 5.4" gem "romaji", "~> 0.3.0" gem "roo", "~> 2" -gem "rorvswild" +# gem "rorvswild" gem "rswag", "~> 2" gem "ruby-vips", "~> 2.3" gem "sanitize" @@ -108,7 +108,7 @@ group :development do gem "better_errors" gem "binding_of_caller" gem "listen", "~> 3.10" - gem "rack-mini-profiler", "~> 4.0" + # gem "rack-mini-profiler", "~> 4.0" gem "spring" gem "web-console", ">= 4.1.0" end diff --git a/Gemfile.lock b/Gemfile.lock index 911783d083..8ba4fc7702 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -538,8 +538,6 @@ GEM raabro (1.5.0) racc (1.8.1) rack (3.2.6) - rack-mini-profiler (4.0.1) - rack (>= 1.2.0) rack-protection (4.2.1) base64 (>= 0.1.0) logger (>= 1.6.0) @@ -622,7 +620,6 @@ GEM roo (2.10.1) nokogiri (~> 1) rubyzip (>= 1.3.0, < 3.0.0) - rorvswild (1.12.0) rotp (6.3.0) rouge (5.1.0) strscan (~> 3.1) @@ -848,7 +845,6 @@ DEPENDENCIES pg_query pghero puma - rack-mini-profiler (~> 4.0) rack-timeout rails (~> 8.1.3) rails-autocomplete (~> 2) @@ -857,7 +853,6 @@ DEPENDENCIES redis (~> 5.4) romaji (~> 0.3.0) roo (~> 2) - rorvswild rspec-rails rswag (~> 2) ruby-vips (~> 2.3) diff --git a/README.md b/README.md index 2a37ac8d22..49510fadd9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# osuny +# osuny, CMS d'intérêt général [osuny.org](https://www.osuny.org) diff --git a/app/assets/stylesheets/admin/osuny/file.sass b/app/assets/stylesheets/admin/osuny/file.sass index 7f43c8cec2..dc36c5de90 100644 --- a/app/assets/stylesheets/admin/osuny/file.sass +++ b/app/assets/stylesheets/admin/osuny/file.sass @@ -3,7 +3,7 @@ text-align: center background: $color-bg-soft color: $color-flexoki-200 - font-size: pxToRem(100) - padding: pxToRem(40) + font-size: pxToRem(60) + padding: pxToRem(30) border-radius: $border-radius margin-bottom: 1rem \ No newline at end of file diff --git a/app/assets/stylesheets/vue/cropper.sass b/app/assets/stylesheets/vue/cropper.sass index 8ac09df5f1..839bf4b1fa 100644 --- a/app/assets/stylesheets/vue/cropper.sass +++ b/app/assets/stylesheets/vue/cropper.sass @@ -1,5 +1,20 @@ .vue__cropper + // Passe au-dessus de la barre de sauvegarde (.vue__changes -> z-index 9999) + z-index: 10000 + &__button + background: white + border-radius: $border-radius + cursor: pointer + padding: 5px + position: absolute + right: 10px + top: 10px + z-index: 10 + &__preview + overflow: hidden + position: relative + width: 100% + .modal-body + background: #000000 .vue-advanced-cropper height: 100% - .modal-body - height: 60vh \ No newline at end of file diff --git a/app/assets/stylesheets/vue/media-input.sass b/app/assets/stylesheets/vue/media-input.sass new file mode 100644 index 0000000000..ddf72ce9c1 --- /dev/null +++ b/app/assets/stylesheets/vue/media-input.sass @@ -0,0 +1,45 @@ +.vue__media-input + &__cloud + &__results + column-count: 2 + column-gap: 16px + @include media-breakpoint-up(lg) + column-count: 3 + &--medias + column-count: 2 + @include media-breakpoint-up(md) + column-count: 3 + @include media-breakpoint-up(lg) + column-count: 4 + @include media-breakpoint-up(xl) + column-count: 5 + @include media-breakpoint-up(xxl) + column-count: 6 + &__result + display: block + margin-bottom: 16px + max-width: 100% + &__button_container + min-width: 70px + &__uploader + position: relative + align-items: center + aspect-ratio: 16/9 + background: $color-bg-soft + display: flex + flex-direction: column + justify-content: center + margin-bottom: 10px + padding: 20px + text-align: center + width: 100% + &--dragging + border: 5px solid $color-black + &__progress + background: $color-black + bottom: 0 + left: 0 + opacity: 0.3 + position: absolute + right: 0 + transition: height 0.1s diff --git a/app/assets/stylesheets/vue/media-picker.sass b/app/assets/stylesheets/vue/media-picker.sass deleted file mode 100644 index 07c88c895b..0000000000 --- a/app/assets/stylesheets/vue/media-picker.sass +++ /dev/null @@ -1,34 +0,0 @@ -.vue__media-picker - &__selector - &__viewport - align-items: center - aspect-ratio: 4/3 - background: $color-bg-soft - display: flex - flex-direction: column - justify-content: center - margin-bottom: 10px - padding: 20px - text-align: center - width: 100% - &__results - column-count: 2 - column-gap: 16px - @include media-breakpoint-up(lg) - column-count: 3 - &--medias - column-count: 2 - @include media-breakpoint-up(md) - column-count: 3 - @include media-breakpoint-up(lg) - column-count: 4 - @include media-breakpoint-up(xl) - column-count: 5 - @include media-breakpoint-up(xxl) - column-count: 6 - &__result - display: block - margin-bottom: 16px - max-width: 100% - &__button_container - min-width: 70px \ No newline at end of file diff --git a/app/assets/stylesheets/vue/selected-media.sass b/app/assets/stylesheets/vue/selected-media.sass new file mode 100644 index 0000000000..e0fae65a0e --- /dev/null +++ b/app/assets/stylesheets/vue/selected-media.sass @@ -0,0 +1,15 @@ +.vue__selected-media + container-type: inline-size + position: relative + &__publication + position: absolute + left: 10px + @container (width > 200px) + background: white + border-radius: $border-radius + bottom: 10px + padding: 2px 8px + @container (width < 200px) + bottom: 3px + .vue__selected-media__label + display: none \ No newline at end of file diff --git a/app/controllers/admin/administration/locations_controller.rb b/app/controllers/admin/administration/locations_controller.rb index 4f3ec0721c..279b36830d 100644 --- a/app/controllers/admin/administration/locations_controller.rb +++ b/app/controllers/admin/administration/locations_controller.rb @@ -81,7 +81,6 @@ def location_params localizations_attributes: [ :id, :language_id, :name, :address_additional, :address_name, :url, :summary, :slug, - :featured_image, :featured_image_delete, :featured_image_infos, :featured_image_alt, :featured_image_credit ] ) .merge( diff --git a/app/controllers/admin/communication/extranets/posts_controller.rb b/app/controllers/admin/communication/extranets/posts_controller.rb index af363ed17d..e37140e647 100644 --- a/app/controllers/admin/communication/extranets/posts_controller.rb +++ b/app/controllers/admin/communication/extranets/posts_controller.rb @@ -79,8 +79,6 @@ def post_params :id, :language_id, :title, :summary, :text, :published, :published_at, :pinned, :slug, - :featured_image, :featured_image_delete, :featured_image_infos, - :featured_image_alt, :featured_image_credit ] ) .merge( diff --git a/app/controllers/admin/communication/library/files_controller.rb b/app/controllers/admin/communication/library/files_controller.rb index 9372d9d7ce..7371a9e45d 100644 --- a/app/controllers/admin/communication/library/files_controller.rb +++ b/app/controllers/admin/communication/library/files_controller.rb @@ -24,8 +24,15 @@ def picker end def show - @contexts = @l10n.contexts - breadcrumb + respond_to do |format| + format.html do + @contexts = @l10n.contexts + breadcrumb + end + format.json do + @l10n = @file.create_localization_if_missing!(current_language) + end + end end def new @@ -36,7 +43,12 @@ def new def direct_upload @blob = ActiveStorage::Blob.create_before_direct_upload!(**blob_args) @blob.update_column(:university_id, current_university&.id) - @l10n = Communication::File::Localization.find_or_create_from_blob(@blob, current_language, current_user) + # Le blob est sur la localisation, contrairement aux médias + @l10n = Communication::File::Localization.find_or_create_file_localization_from_blob( + @blob, + language: current_language, + user: current_user + ) @file = @l10n.file end @@ -49,7 +61,8 @@ def edit def create @file.created_by = current_user if @file.save - redirect_to [:admin, @file], notice: t('admin.successfully_created_html', model: @file.to_s_in(current_language)) + redirect_to [:admin, @file], + notice: t('admin.successfully_created_html', model: @file.to_s_in(current_language)) else load_invalid_localization @categories = categories @@ -60,8 +73,10 @@ def create def update if @file.update(file_params) - @file.localization_for(current_language).update_column(:last_updated_by_id, current_user.id) - redirect_to [:admin, @file], notice: t('admin.successfully_updated_html', model: @file.to_s_in(current_language)) + @file.localization_for(current_language) + .update_column(:updated_by_id, current_user.id) + redirect_to [:admin, @file], + notice: t('admin.successfully_updated_html', model: @file.to_s_in(current_language)) else load_invalid_localization @categories = categories @@ -73,7 +88,8 @@ def update def destroy @file.destroy - redirect_to admin_communication_files_url, notice: t('admin.successfully_destroyed_html', model: @file.to_s_in(current_language)) + redirect_to admin_communication_files_url, + notice: t('admin.successfully_destroyed_html', model: @file.to_s_in(current_language)) end protected @@ -88,7 +104,6 @@ def file_params category_ids: [], localizations_attributes: [ :id, :name, :alt, :credit, :internal_description, :meta_description, :published, - :featured_image, :featured_image_delete, :featured_image_infos, :featured_image_alt, :featured_image_credit, :original_uploaded_file, :language_id ] ) diff --git a/app/controllers/admin/communication/library/medias/photo_imports_controller.rb b/app/controllers/admin/communication/library/medias/photo_imports_controller.rb index 7029ae2940..b899890fe1 100644 --- a/app/controllers/admin/communication/library/medias/photo_imports_controller.rb +++ b/app/controllers/admin/communication/library/medias/photo_imports_controller.rb @@ -35,6 +35,26 @@ def pexels end end + def select + origin = params[:origin] + + @media = Communication::Media.find_or_create_from_url( + params[:source], + university_id: current_university.id, + user: current_user, + origin: origin + ) + @media.find_or_create_localization(current_language, credit: params[:credit]) + + if origin == 'unsplash' + # Tracking légal Unsplash + unsplash_photo = Unsplash::Photo.find(params[:id]) + unsplash_photo.track_download + end + + render json: @media.id + end + protected def prepare diff --git a/app/controllers/admin/communication/library/medias_controller.rb b/app/controllers/admin/communication/library/medias_controller.rb index 8d3191bbef..c889c9a176 100644 --- a/app/controllers/admin/communication/library/medias_controller.rb +++ b/app/controllers/admin/communication/library/medias_controller.rb @@ -5,9 +5,10 @@ class Admin::Communication::Library::MediasController < Admin::Communication::Li include Admin::Localizable def index - @medias = @medias.filter_by(params[:filters], current_language) - .ordered(current_language) - .page(params[:page]) + @filtered = @medias.filter_by(params[:filters], current_language) + @medias = @filtered.at_lifecycle(params[:lifecycle], current_language) + .ordered(current_language) + .page(params[:page]) @collections = current_university.communication_media_collections .ordered(current_language) @categories = categories.root @@ -24,8 +25,20 @@ def picker end def show - @contexts = @media.contexts - breadcrumb + respond_to do |format| + format.html do + @contexts = @media.contexts + breadcrumb + end + format.json do + @l10n = @media.find_or_create_localization(current_language) + context_about_gid = params.dig(:context_about_gid) + if context_about_gid.present? + context_about = GlobalID::Locator.locate(context_about_gid) + @context = @media.context_for(context_about) + end + end + end end def new @@ -33,12 +46,29 @@ def new breadcrumb end - def pick - picker = Osuny::Media::Picker.new - picker.university = current_university - picker.language = current_language - picker.params = params.to_unsafe_hash - render json: picker.to_json + def direct_upload + @blob = ActiveStorage::Blob.create_before_direct_upload!(**blob_args) + @blob.update_column(:university_id, current_university&.id) + # Le blob est sur le média, pas sur la loca (contrairement aux files) + @media = Communication::Media.find_or_create_media_from_blob(@blob, user: current_user) + @l10n = @media.find_or_create_localization(current_language) + end + + def set_featured + @l10n = PolymorphicObjectFinder.find( + params, + key: :about, + university: current_university + ) + return if @l10n.nil? + raise unless can?(:update, @l10n.about) + @media = @l10n.set_featured_media!( + id: params.dig(:featured_media_id), + alt: params.dig(:featured_media_alt), + crop_settings: params.dig(:crop_settings)&.to_unsafe_hash, + language: current_language + ) + @context = @media&.context_for(@l10n) end def edit @@ -50,7 +80,8 @@ def edit def create @media.created_by = current_user if @media.save - redirect_to [:admin, @media], notice: t('admin.successfully_created_html', model: @media.to_s_in(current_language)) + redirect_to [:admin, @media], + notice: t('admin.successfully_created_html', model: @media.to_s_in(current_language)) else load_invalid_localization @categories = categories @@ -61,7 +92,10 @@ def create def update if @media.update(media_params) - redirect_to [:admin, @media], notice: t('admin.successfully_updated_html', model: @media.to_s_in(current_language)) + @media.localization_for(current_language) + .update_column(:updated_by_id, current_user.id) + redirect_to [:admin, @media], + notice: t('admin.successfully_updated_html', model: @media.to_s_in(current_language)) else load_invalid_localization @categories = categories @@ -73,17 +107,22 @@ def update def destroy @media.destroy - redirect_to admin_communication_medias_url, notice: t('admin.successfully_destroyed_html', model: @media.to_s_in(current_language)) + redirect_to admin_communication_medias_url, + notice: t('admin.successfully_destroyed_html', model: @media.to_s_in(current_language)) end protected + def blob_args + params.require(:blob).permit(:filename, :byte_size, :checksum, :content_type, metadata: {}).to_h.symbolize_keys + end + def media_params params.require(:communication_media) .permit( :communication_media_collection_id, :original_uploaded_file, category_ids: [], localizations_attributes: [ - :id, :name, :alt, :credit, :internal_description, :language_id + :id, :name, :alt, :credit, :internal_description, :language_id, :published, ] ) .merge(university_id: current_university.id) diff --git a/app/controllers/admin/communication/websites/agenda/events_controller.rb b/app/controllers/admin/communication/websites/agenda/events_controller.rb index 0886742fdc..6e89604010 100644 --- a/app/controllers/admin/communication/websites/agenda/events_controller.rb +++ b/app/controllers/admin/communication/websites/agenda/events_controller.rb @@ -141,7 +141,6 @@ def event_params :id, :title, :subtitle, :meta_description, :summary, :text, :notes, :published, :published_at, :slug, :header_cta, :header_cta_label, :header_cta_url, - :featured_image, :featured_image_delete, :featured_image_infos, :featured_image_alt, :featured_image_credit, :shared_image, :shared_image_delete, :shared_image_infos, :language_id ] diff --git a/app/controllers/admin/communication/websites/agenda/exhibitions_controller.rb b/app/controllers/admin/communication/websites/agenda/exhibitions_controller.rb index b7681c4e01..24f0d87cc9 100644 --- a/app/controllers/admin/communication/websites/agenda/exhibitions_controller.rb +++ b/app/controllers/admin/communication/websites/agenda/exhibitions_controller.rb @@ -113,7 +113,6 @@ def exhibition_params :id, :title, :subtitle, :meta_description, :summary, :text, :notes, :place, :published, :published_at, :slug, :header_cta, :header_cta_label, :header_cta_url, - :featured_image, :featured_image_delete, :featured_image_infos, :featured_image_alt, :featured_image_credit, :shared_image, :shared_image_delete, :shared_image_infos, :language_id ] diff --git a/app/controllers/admin/communication/websites/jobboard/jobs_controller.rb b/app/controllers/admin/communication/websites/jobboard/jobs_controller.rb index 61acae80b1..482ba26db6 100644 --- a/app/controllers/admin/communication/websites/jobboard/jobs_controller.rb +++ b/app/controllers/admin/communication/websites/jobboard/jobs_controller.rb @@ -111,7 +111,6 @@ def job_params :id, :title, :subtitle, :meta_description, :summary, :published, :published_at, :slug, :header_cta, :header_cta_label, :header_cta_url, - :featured_image, :featured_image_delete, :featured_image_infos, :featured_image_alt, :featured_image_credit, :shared_image, :shared_image_delete, :shared_image_infos, :language_id ] diff --git a/app/controllers/admin/communication/websites/pages_controller.rb b/app/controllers/admin/communication/websites/pages_controller.rb index 633bd638c9..a6589cb11d 100644 --- a/app/controllers/admin/communication/websites/pages_controller.rb +++ b/app/controllers/admin/communication/websites/pages_controller.rb @@ -184,7 +184,6 @@ def page_params localizations_attributes: [ :id, :title, :subtitle, :breadcrumb_title, :meta_description, :summary, :header_text, :text, :slug, :published, :header_cta, :header_cta_label, :header_cta_url, - :featured_image, :featured_image_delete, :featured_image_infos, :featured_image_alt, :featured_image_credit, :shared_image, :shared_image_delete, :shared_image_infos, :language_id ] diff --git a/app/controllers/admin/communication/websites/portfolio/projects_controller.rb b/app/controllers/admin/communication/websites/portfolio/projects_controller.rb index 384e7200e4..56d74015ab 100644 --- a/app/controllers/admin/communication/websites/portfolio/projects_controller.rb +++ b/app/controllers/admin/communication/websites/portfolio/projects_controller.rb @@ -111,7 +111,6 @@ def project_params :id, :title, :subtitle, :meta_description, :summary, :published, :published_at, :slug, :header_cta, :header_cta_label, :header_cta_url, - :featured_image, :featured_image_delete, :featured_image_infos, :featured_image_alt, :featured_image_credit, :shared_image, :shared_image_delete, :shared_image_infos, :language_id ] diff --git a/app/controllers/admin/communication/websites/posts_controller.rb b/app/controllers/admin/communication/websites/posts_controller.rb index 0d731b456d..2f07a56ff9 100644 --- a/app/controllers/admin/communication/websites/posts_controller.rb +++ b/app/controllers/admin/communication/websites/posts_controller.rb @@ -126,7 +126,6 @@ def post_params :id, :title, :subtitle, :meta_description, :summary, :header_cta, :header_cta_label, :header_cta_url, :published, :published_at, :unpublished_at, :slug, :pinned, - :featured_image, :featured_image_delete, :featured_image_infos, :featured_image_alt, :featured_image_credit, :shared_image, :shared_image_delete, :shared_image_infos, :language_id ] diff --git a/app/controllers/admin/education/programs_controller.rb b/app/controllers/admin/education/programs_controller.rb index 299dd6b89d..4d54ff83f9 100644 --- a/app/controllers/admin/education/programs_controller.rb +++ b/app/controllers/admin/education/programs_controller.rb @@ -96,6 +96,13 @@ def restore notice: t('admin.successfully_restored_html', model: @program.to_s_in(current_language)) end + def set_downloadable_summary + @program.set_downloadable_summary!( + id: params[:downloadable_summary_id], + language: current_language + ) + end + protected def prepare_preview @@ -147,12 +154,10 @@ def program_params :meta_description, :summary, :published, :qualiopi_text, :logo, :logo_delete, - :featured_image, :featured_image_delete, :featured_image_infos, :featured_image_alt, :featured_image_credit, :shared_image, :shared_image_delete, :prerequisites, :objectives, :presentation, :registration, :pedagogy, :content, :registration_url, :evaluation, :accessibility, :contacts, :opportunities, :results, :other, :main_information, :pricing, :pricing_apprenticeship, :pricing_continuing, :pricing_initial, :duration, - :downloadable_summary, :downloadable_summary_delete, ] ) .merge( diff --git a/app/controllers/admin/research/journals/volumes_controller.rb b/app/controllers/admin/research/journals/volumes_controller.rb index 6a6e3fccd1..0b17537a2e 100644 --- a/app/controllers/admin/research/journals/volumes_controller.rb +++ b/app/controllers/admin/research/journals/volumes_controller.rb @@ -96,7 +96,6 @@ def volume_params localizations_attributes: [ :id, :language_id, :title, :slug, :keywords, :published, :published_at, :meta_description, :summary, :text, - :featured_image, :featured_image_delete, :featured_image_infos, :featured_image_alt, :featured_image_credit ] ) .merge(university_id: current_university.id) diff --git a/app/controllers/admin/university/organizations_controller.rb b/app/controllers/admin/university/organizations_controller.rb index 3149be9880..60d73e915a 100644 --- a/app/controllers/admin/university/organizations_controller.rb +++ b/app/controllers/admin/university/organizations_controller.rb @@ -125,7 +125,6 @@ def organization_params :url, :linkedin, :twitter, :mastodon, :logo, :logo_delete, :logo_infos, :logo_on_dark_background, :logo_on_dark_background_delete, :logo_on_dark_background_infos, - :featured_image, :featured_image_delete, :featured_image_infos, :featured_image_alt, :featured_image_credit, :shared_image, :shared_image_delete, :language_id ] diff --git a/app/controllers/api/osuny/application_controller/with_resource_params.rb b/app/controllers/api/osuny/application_controller/with_resource_params.rb index 4cf5f9ee96..0fac5d22ff 100644 --- a/app/controllers/api/osuny/application_controller/with_resource_params.rb +++ b/app/controllers/api/osuny/application_controller/with_resource_params.rb @@ -24,7 +24,7 @@ def set_l10n_attributes(base_params, resource) ) if resource&.persisted? l10n_permitted_params[:id] = existing_resource_l10n.id if existing_resource_l10n.present? - set_featured_image_to_l10n_params(l10n_permitted_params, l10n: existing_resource_l10n) + set_featured_media_to_l10n_params(l10n_permitted_params, l10n: existing_resource_l10n) set_blocks_attributes_to_l10n_params(l10n_permitted_params, l10n: existing_resource_l10n) set_aliases_attributes_to_l10n_params(l10n_permitted_params, l10n: existing_resource_l10n) @@ -32,20 +32,28 @@ def set_l10n_attributes(base_params, resource) end end - def set_featured_image_to_l10n_params(l10n_params, l10n: nil) + def set_featured_media_to_l10n_params(l10n_params, l10n: nil) featured_image_data = l10n_params.delete(:featured_image) return unless featured_image_data.present? - l10n_params[:featured_image_alt] = featured_image_data[:alt] if featured_image_data.has_key?(:alt) - l10n_params[:featured_image_credit] = featured_image_data[:credit] if featured_image_data.has_key?(:credit) - l10n_params[:featured_image_delete] = '1' if featured_image_data[:_destroy] + l10n_params[:featured_media_alt] = featured_image_data[:alt] if featured_image_data.has_key?(:alt) + l10n_params[:featured_media_id] = nil if featured_image_data[:_destroy] if featured_image_data[:blob_id].present? - # If we send a blob_id, we attach it to the localization + # If we send a blob_id, we use the media made from this blob blob = current_university.active_storage_blobs.find_by(id: featured_image_data[:blob_id]) - l10n_params[:featured_image] = blob if blob.present? + if blob.present? + media = Communication::Media.find_or_create_media_from_blob(blob) + media.find_or_create_localization( + current_university.default_language, + alt: featured_image_data[:alt], + credit: featured_image_data[:credit] + ) + media.add_context(l10n) if l10n.present? + l10n_params[:featured_media_id] = media.id if media.present? + end end - # Set the image URL so that the object can delay the upload if needed - l10n_params[:featured_image_new_url] = featured_image_data[:url] - # We also force the updated_at to change, as changing on the featured_image does not trigger the save + # Set the image URL so that the object can delay the import if needed + l10n_params[:featured_media_new_url] = featured_image_data[:url] + # We also force the updated_at to change, as changing the media does not trigger the save l10n_params[:updated_at] = Time.current end diff --git a/app/controllers/api/osuny/communication/medias_controller.rb b/app/controllers/api/osuny/communication/medias_controller.rb index 77d7337bd4..656b1ec079 100644 --- a/app/controllers/api/osuny/communication/medias_controller.rb +++ b/app/controllers/api/osuny/communication/medias_controller.rb @@ -6,7 +6,8 @@ def show end def create - @media = Communication::Media.find_or_create_from_blob(@blob) + @media = Communication::Media.find_or_create_media_from_blob(@blob) + @media.find_or_create_localization(current_university.default_language) if @media.persisted? render :show, status: :created else diff --git a/app/controllers/api/osuny/communication/websites/agenda/categories_controller.rb b/app/controllers/api/osuny/communication/websites/agenda/categories_controller.rb index 1fa848f4eb..c9e008d3f7 100644 --- a/app/controllers/api/osuny/communication/websites/agenda/categories_controller.rb +++ b/app/controllers/api/osuny/communication/websites/agenda/categories_controller.rb @@ -86,6 +86,7 @@ def l10n_permitted_keys [ :migration_identifier, :language, :name, :meta_description, :path, :slug, :summary, :_destroy, + :featured_media_id, :featured_media_alt, featured_image: [:blob_id, :url, :alt, :credit, :_destroy], **nested_blocks_params ] diff --git a/app/controllers/api/osuny/communication/websites/agenda/events_controller.rb b/app/controllers/api/osuny/communication/websites/agenda/events_controller.rb index 16d1403afd..e69a5901cb 100644 --- a/app/controllers/api/osuny/communication/websites/agenda/events_controller.rb +++ b/app/controllers/api/osuny/communication/websites/agenda/events_controller.rb @@ -86,6 +86,7 @@ def l10n_permitted_keys [ :migration_identifier, :language, :title, :meta_description, :published, :published_at, :slug, :subtitle, :summary, :text, :_destroy, + :featured_media_id, :featured_media_alt, featured_image: [:blob_id, :url, :alt, :credit, :_destroy], **nested_aliases_params, **nested_blocks_params diff --git a/app/controllers/api/osuny/communication/websites/pages/categories_controller.rb b/app/controllers/api/osuny/communication/websites/pages/categories_controller.rb index 0bbd3e3afb..e85488ea73 100644 --- a/app/controllers/api/osuny/communication/websites/pages/categories_controller.rb +++ b/app/controllers/api/osuny/communication/websites/pages/categories_controller.rb @@ -86,6 +86,7 @@ def l10n_permitted_keys [ :migration_identifier, :language, :name, :meta_description, :path, :slug, :summary, :_destroy, + :featured_media_id, :featured_media_alt, featured_image: [:blob_id, :url, :alt, :credit, :_destroy], **nested_blocks_params ] diff --git a/app/controllers/api/osuny/communication/websites/pages_controller.rb b/app/controllers/api/osuny/communication/websites/pages_controller.rb index 9d3e4a630b..26f44f6243 100644 --- a/app/controllers/api/osuny/communication/websites/pages_controller.rb +++ b/app/controllers/api/osuny/communication/websites/pages_controller.rb @@ -87,6 +87,7 @@ def l10n_permitted_keys :migration_identifier, :language, :title, :breadcrumb_title, :meta_description, :published, :published_at, :slug, :summary, :text, :header_text, :header_cta, :header_cta_label, :header_cta_url, :_destroy, + :featured_media_id, :featured_media_alt, featured_image: [:blob_id, :url, :alt, :credit, :_destroy], **nested_aliases_params, **nested_blocks_params diff --git a/app/controllers/api/osuny/communication/websites/portfolio/categories_controller.rb b/app/controllers/api/osuny/communication/websites/portfolio/categories_controller.rb index cd6e1bfab5..e2f202a5b7 100644 --- a/app/controllers/api/osuny/communication/websites/portfolio/categories_controller.rb +++ b/app/controllers/api/osuny/communication/websites/portfolio/categories_controller.rb @@ -86,6 +86,7 @@ def l10n_permitted_keys [ :migration_identifier, :language, :name, :meta_description, :path, :slug, :summary, :_destroy, + :featured_media_id, :featured_media_alt, featured_image: [:blob_id, :url, :alt, :credit, :_destroy], **nested_blocks_params ] diff --git a/app/controllers/api/osuny/communication/websites/portfolio/projects_controller.rb b/app/controllers/api/osuny/communication/websites/portfolio/projects_controller.rb index 4dfdd21ce1..326c737530 100644 --- a/app/controllers/api/osuny/communication/websites/portfolio/projects_controller.rb +++ b/app/controllers/api/osuny/communication/websites/portfolio/projects_controller.rb @@ -86,6 +86,7 @@ def l10n_permitted_keys [ :migration_identifier, :language, :title, :meta_description, :published, :published_at, :slug, :subtitle, :summary, :_destroy, + :featured_media_id, :featured_media_alt, featured_image: [:blob_id, :url, :alt, :credit, :_destroy], **nested_aliases_params, **nested_blocks_params diff --git a/app/controllers/api/osuny/communication/websites/posts/categories_controller.rb b/app/controllers/api/osuny/communication/websites/posts/categories_controller.rb index 1021d4a204..fcfc91e922 100644 --- a/app/controllers/api/osuny/communication/websites/posts/categories_controller.rb +++ b/app/controllers/api/osuny/communication/websites/posts/categories_controller.rb @@ -86,6 +86,7 @@ def l10n_permitted_keys [ :migration_identifier, :language, :name, :meta_description, :path, :slug, :summary, :_destroy, + :featured_media_id, :featured_media_alt, featured_image: [:blob_id, :url, :alt, :credit, :_destroy], **nested_blocks_params ] diff --git a/app/controllers/api/osuny/communication/websites/posts_controller.rb b/app/controllers/api/osuny/communication/websites/posts_controller.rb index 849de7bcfc..a7f0554615 100644 --- a/app/controllers/api/osuny/communication/websites/posts_controller.rb +++ b/app/controllers/api/osuny/communication/websites/posts_controller.rb @@ -86,6 +86,7 @@ def l10n_permitted_keys [ :migration_identifier, :language, :title, :meta_description, :pinned, :published, :published_at, :slug, :subtitle, :summary, :_destroy, + :featured_media_id, :featured_media_alt, featured_image: [:blob_id, :url, :alt, :credit, :_destroy], **nested_aliases_params, **nested_blocks_params diff --git a/app/controllers/api/osuny/university/organizations/categories_controller.rb b/app/controllers/api/osuny/university/organizations/categories_controller.rb index d8d24f71b6..0a0aa2e425 100644 --- a/app/controllers/api/osuny/university/organizations/categories_controller.rb +++ b/app/controllers/api/osuny/university/organizations/categories_controller.rb @@ -86,6 +86,7 @@ def l10n_permitted_keys [ :migration_identifier, :language, :name, :meta_description, :path, :slug, :summary, :_destroy, + :featured_media_id, :featured_media_alt, featured_image: [:blob_id, :url, :alt, :credit, :_destroy], **nested_blocks_params ] diff --git a/app/controllers/api/osuny/university/organizations_controller.rb b/app/controllers/api/osuny/university/organizations_controller.rb index 95d99afdb3..583fed3d6b 100644 --- a/app/controllers/api/osuny/university/organizations_controller.rb +++ b/app/controllers/api/osuny/university/organizations_controller.rb @@ -87,6 +87,7 @@ def l10n_permitted_keys :migration_identifier, :language, :name, :long_name, :meta_description, :published, :published_at, :address_name, :address_additional, :linkedin, :mastodon, :twitter, :url, :slug, :summary, :text, :_destroy, + :featured_media_id, :featured_media_alt, featured_image: [:blob_id, :url, :alt, :credit, :_destroy], **nested_blocks_params ] diff --git a/app/controllers/concerns/admin/act_as_categories.rb b/app/controllers/concerns/admin/act_as_categories.rb index 3022996036..bef13cb365 100644 --- a/app/controllers/concerns/admin/act_as_categories.rb +++ b/app/controllers/concerns/admin/act_as_categories.rb @@ -48,7 +48,6 @@ def permitted_params_for(object_key) localizations_attributes: [ :id, :name, :slug, :subtitle, :summary, :meta_description, :breadcrumb_title, :header_text, :header_cta, :header_cta_label, :header_cta_url, - :featured_image, :featured_image_delete, :featured_image_infos, :featured_image_alt, :featured_image_credit, :shared_image, :shared_image_delete, :shared_image_infos, :language_id ]).merge(university_id: current_university.id) diff --git a/app/controllers/concerns/admin/localizable.rb b/app/controllers/concerns/admin/localizable.rb index 854eb34700..32f806efd3 100644 --- a/app/controllers/concerns/admin/localizable.rb +++ b/app/controllers/concerns/admin/localizable.rb @@ -10,7 +10,8 @@ module Admin::Localizable before_action :load_localization, :redirect_if_not_localized, - only: [:show, :edit, :static, :publish, :preview] + only: [:show, :edit, :static, :publish, :preview], + unless: -> { request.format.json? } end protected diff --git a/app/controllers/media_controller.rb b/app/controllers/media_controller.rb index 205a9b108a..504137116f 100644 --- a/app/controllers/media_controller.rb +++ b/app/controllers/media_controller.rb @@ -37,11 +37,6 @@ def static content_type: "text/plain; charset=utf-8" end - def resize - resizer = Osuny::Media::Resizer.new(@blob, params) - render json: resizer.to_json - end - protected def load_blob diff --git a/app/helpers/admin/application_helper.rb b/app/helpers/admin/application_helper.rb index dfcdafd539..b02939a61c 100644 --- a/app/helpers/admin/application_helper.rb +++ b/app/helpers/admin/application_helper.rb @@ -153,6 +153,15 @@ def is_information_public?(about, attribute) about.respond_to?(publicity) ? about.public_send(publicity) : true end + # Pour dépolluer les urls simplement + def reset_context + { + website_id: nil, + extranet_id: nil, + journal_id: nil + } + end + private def polymorphic_url_param(object_or_class, **options) diff --git a/app/helpers/admin/osuny_helper.rb b/app/helpers/admin/osuny_helper.rb index d1fc232ad2..8b006529f9 100644 --- a/app/helpers/admin/osuny_helper.rb +++ b/app/helpers/admin/osuny_helper.rb @@ -36,11 +36,10 @@ def osuny_separator def osuny_thumbnail(object, large: false, cropped: true, classes: '') return if object.nil? - image = object.respond_to?(:featured_image) ? object.featured_image - : nil + image_blob = object.try(:featured_blob) render partial: "admin/application/components/thumbnail", locals: { - image: image, + image_blob: image_blob, initials: object.initials, large: large, cropped: cropped, diff --git a/app/javascript/apps/blocks-editor/components/Editor.vue b/app/javascript/apps/blocks-editor/components/Editor.vue index 3c0e0b9756..afc3df4641 100644 --- a/app/javascript/apps/blocks-editor/components/Editor.vue +++ b/app/javascript/apps/blocks-editor/components/Editor.vue @@ -1,12 +1,12 @@ diff --git a/app/javascript/apps/components/inputs/FileInput.vue b/app/javascript/apps/components/inputs/FileInput.vue index a56754922a..100b56a2ce 100644 --- a/app/javascript/apps/components/inputs/FileInput.vue +++ b/app/javascript/apps/components/inputs/FileInput.vue @@ -1,36 +1,66 @@ @@ -38,35 +68,37 @@ export default {
- +
diff --git a/app/javascript/apps/components/inputs/MediaInput.vue b/app/javascript/apps/components/inputs/MediaInput.vue new file mode 100644 index 0000000000..5eb7c835b4 --- /dev/null +++ b/app/javascript/apps/components/inputs/MediaInput.vue @@ -0,0 +1,156 @@ + + + diff --git a/app/javascript/apps/components/inputs/MultiImageInput.vue b/app/javascript/apps/components/inputs/MultiImageInput.vue deleted file mode 100644 index 44b613ca11..0000000000 --- a/app/javascript/apps/components/inputs/MultiImageInput.vue +++ /dev/null @@ -1,113 +0,0 @@ - - - diff --git a/app/javascript/apps/components/inputs/file-input/FileUploader.vue b/app/javascript/apps/components/inputs/file-input/FileUploader.vue new file mode 100644 index 0000000000..e87c70523e --- /dev/null +++ b/app/javascript/apps/components/inputs/file-input/FileUploader.vue @@ -0,0 +1,149 @@ + + + diff --git a/app/javascript/apps/components/inputs/media-input/Cloud.vue b/app/javascript/apps/components/inputs/media-input/Cloud.vue new file mode 100644 index 0000000000..603d46e9c9 --- /dev/null +++ b/app/javascript/apps/components/inputs/media-input/Cloud.vue @@ -0,0 +1,254 @@ + + + diff --git a/app/javascript/apps/components/inputs/media-input/MediaUploader.vue b/app/javascript/apps/components/inputs/media-input/MediaUploader.vue new file mode 100644 index 0000000000..035f09b27d --- /dev/null +++ b/app/javascript/apps/components/inputs/media-input/MediaUploader.vue @@ -0,0 +1,172 @@ + + + diff --git a/app/javascript/apps/components/inputs/primitives/UploadButton.vue b/app/javascript/apps/components/inputs/primitives/UploadButton.vue deleted file mode 100644 index 1762ad5216..0000000000 --- a/app/javascript/apps/components/inputs/primitives/UploadButton.vue +++ /dev/null @@ -1,91 +0,0 @@ - - - diff --git a/app/javascript/apps/components/inputs/primitives/Warning.vue b/app/javascript/apps/components/inputs/primitives/Warning.vue new file mode 100644 index 0000000000..647cb6f903 --- /dev/null +++ b/app/javascript/apps/components/inputs/primitives/Warning.vue @@ -0,0 +1,63 @@ + + + \ No newline at end of file diff --git a/app/javascript/apps/components/selected-objects/SelectedFile.vue b/app/javascript/apps/components/selected-objects/SelectedFile.vue index 5a54547c7d..d7ef3045ed 100644 --- a/app/javascript/apps/components/selected-objects/SelectedFile.vue +++ b/app/javascript/apps/components/selected-objects/SelectedFile.vue @@ -19,17 +19,24 @@ export default {
-
+
- + height="70" + /> +
+
+
diff --git a/app/javascript/apps/components/selected-objects/SelectedMedia.vue b/app/javascript/apps/components/selected-objects/SelectedMedia.vue index bcc4d9e904..534a590f3e 100644 --- a/app/javascript/apps/components/selected-objects/SelectedMedia.vue +++ b/app/javascript/apps/components/selected-objects/SelectedMedia.vue @@ -1,19 +1,113 @@ diff --git a/app/javascript/apps/components/selected-objects/SelectedObject.vue b/app/javascript/apps/components/selected-objects/SelectedObject.vue index 3609e9f071..bad14a7a5f 100644 --- a/app/javascript/apps/components/selected-objects/SelectedObject.vue +++ b/app/javascript/apps/components/selected-objects/SelectedObject.vue @@ -22,8 +22,8 @@ export default { class="card card--osuny card--horizontal">
+import { X } from '@lucide/vue'; +import Changes from '../components/Changes.vue'; +import FileInput from '../components/inputs/FileInput.vue'; + +export default { + components: { + Changes, + FileInput, + X, + }, + data () { + return { + current: {}, + } + }, + computed: { + hasValue() { + return this.current.downloadable_summary_id != ''; + }, + }, + methods: { + remove() { + this.current.downloadable_summary_id = ''; + }, + }, + beforeMount() { + this.dataset = document.getElementById('downloadable-summary-app').dataset + this.current = JSON.parse(this.dataset.current); + }, +}; + + + diff --git a/app/javascript/apps/featured-media/FeaturedMediaApp.vue b/app/javascript/apps/featured-media/FeaturedMediaApp.vue new file mode 100644 index 0000000000..a2b6c46e0f --- /dev/null +++ b/app/javascript/apps/featured-media/FeaturedMediaApp.vue @@ -0,0 +1,84 @@ + + + diff --git a/app/javascript/apps/i18n.js b/app/javascript/apps/i18n.js index 56c5d7b8fd..d8b01f58c5 100644 --- a/app/javascript/apps/i18n.js +++ b/app/javascript/apps/i18n.js @@ -20,6 +20,7 @@ export function getI18n() { return createI18n({ legacy: false, globalInjection: true, + warnHtmlMessage: false, locale, fallbackLocale: 'fr', messages: { [locale]: messages }, diff --git a/app/javascript/apps/index.js b/app/javascript/apps/index.js index aafd59d34a..b149db9453 100644 --- a/app/javascript/apps/index.js +++ b/app/javascript/apps/index.js @@ -1,10 +1,11 @@ import { createApp } from 'vue'; import { getI18n } from './i18n'; -import SsoMappingApp from './sso-mapping/SsoMappingApp.vue'; -import MediaPickerApp from './media-picker/MediaPickerApp.vue'; -import TimeSlotsApp from './time-slots/TimeSlotsApp.vue'; import BlocksEditorApp from './blocks-editor/BlocksEditorApp.vue'; +import DownloadableSummaryApp from './downloadable-summary/DownloadableSummaryApp.vue'; +import FeaturedMediaApp from './featured-media/FeaturedMediaApp.vue'; import PickerTestApp from './picker/PickerTestApp.vue'; +import SsoMappingApp from './sso-mapping/SsoMappingApp.vue'; +import TimeSlotsApp from './time-slots/TimeSlotsApp.vue'; async function boot() { const i18n = await getI18n(); @@ -15,11 +16,12 @@ async function boot() { } }; - mount(SsoMappingApp, '#sso-mapping-app'); - mount(MediaPickerApp, '#media-picker-app'); - mount(TimeSlotsApp, '#time-slots-app'); mount(BlocksEditorApp, '#blocks-editor-app'); + mount(DownloadableSummaryApp, '#downloadable-summary-app'); + mount(FeaturedMediaApp, '#featured-media-app'); mount(PickerTestApp, '#picker-test-app'); + mount(SsoMappingApp, '#sso-mapping-app'); + mount(TimeSlotsApp, '#time-slots-app'); } boot(); diff --git a/app/javascript/apps/media-picker/MediaPickerApp.vue b/app/javascript/apps/media-picker/MediaPickerApp.vue deleted file mode 100644 index 9a24d8cda7..0000000000 --- a/app/javascript/apps/media-picker/MediaPickerApp.vue +++ /dev/null @@ -1,116 +0,0 @@ - - - diff --git a/app/javascript/apps/media-picker/components/Cloud.vue b/app/javascript/apps/media-picker/components/Cloud.vue deleted file mode 100644 index 81ce7beea0..0000000000 --- a/app/javascript/apps/media-picker/components/Cloud.vue +++ /dev/null @@ -1,220 +0,0 @@ - - - diff --git a/app/javascript/apps/media-picker/components/ImageUploader.vue b/app/javascript/apps/media-picker/components/ImageUploader.vue deleted file mode 100644 index fdf23b17c8..0000000000 --- a/app/javascript/apps/media-picker/components/ImageUploader.vue +++ /dev/null @@ -1,173 +0,0 @@ - - - diff --git a/app/javascript/apps/media-picker/components/Medias.vue b/app/javascript/apps/media-picker/components/Medias.vue deleted file mode 100644 index c4b75d078c..0000000000 --- a/app/javascript/apps/media-picker/components/Medias.vue +++ /dev/null @@ -1,192 +0,0 @@ - - - diff --git a/app/javascript/apps/media-picker/components/medias/Categories.vue b/app/javascript/apps/media-picker/components/medias/Categories.vue deleted file mode 100644 index f789988341..0000000000 --- a/app/javascript/apps/media-picker/components/medias/Categories.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - diff --git a/app/javascript/apps/media-picker/components/medias/Taxonomies.vue b/app/javascript/apps/media-picker/components/medias/Taxonomies.vue deleted file mode 100644 index 990f8ce8a0..0000000000 --- a/app/javascript/apps/media-picker/components/medias/Taxonomies.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - diff --git a/app/javascript/apps/picker/Picker.vue b/app/javascript/apps/picker/Picker.vue index 43b75794d8..7176954f13 100644 --- a/app/javascript/apps/picker/Picker.vue +++ b/app/javascript/apps/picker/Picker.vue @@ -26,13 +26,17 @@ export default { // en partant du paramètre accept de l'input file accept: { type: String, default: '*' }, }, - emits: ['update:modelValue'], + emits: [ + 'picked', + 'update:modelValue' + ], computed: { value: { get() { return this.modelValue; }, set(value) { + this.$emit('picked', value); this.$emit('update:modelValue', value); } } @@ -107,6 +111,7 @@ export default { @keydown.esc="close">
-
+
diff --git a/app/javascript/apps/picker/components/Pagination.vue b/app/javascript/apps/picker/components/Pagination.vue index dd59a638dd..7e8559a5f1 100644 --- a/app/javascript/apps/picker/components/Pagination.vue +++ b/app/javascript/apps/picker/components/Pagination.vue @@ -30,33 +30,33 @@ export default { diff --git a/app/javascript/apps/picker/components/Parameters.vue b/app/javascript/apps/picker/components/Parameters.vue index c8ccdd68eb..6b91228fae 100644 --- a/app/javascript/apps/picker/components/Parameters.vue +++ b/app/javascript/apps/picker/components/Parameters.vue @@ -11,13 +11,23 @@ export default { emits: [ 'change', ], + data() { + return { + term: '', + searchDebounceTimeout: null, + }; + }, methods: { update() { this.buildQuery(); this.$emit('change'); }, + updateDebounced() { + clearTimeout(this.searchDebounceTimeout); + this.searchDebounceTimeout = setTimeout(this.update, 300); + }, buildQuery() { - this.parameters.query_parameters = "&filters[for_search_term]=" + encodeURIComponent(this.parameters.search.term); + this.parameters.query_parameters = "&filters[for_search_term]=" + encodeURIComponent(this.term); this.parameters.filters.forEach(filter => { this.addSelectedValuesToQuery(filter.values); }); @@ -44,14 +54,15 @@ export default {